Module: Jade::Codegen::Boundary::Specialized::List

Extended by:
List
Included in:
List
Defined in:
lib/jade/codegen/boundary/specialized/list.rb

Overview

List(t) where t is itself specializable. Two shapes:

  • List(scalar) — emits a single Array#all? C-loop check via Boundary.list_of, then passes the array through.
  • List(specializable) — validates Array shape with Boundary.array, then maps the inner decoder over each element.

Instance Method Summary collapse

Instance Method Details

#decode(type, input, registry) ⇒ Object



14
15
16
17
18
19
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 14

def decode(type, input, registry)
  inner = inner_of(type) or return nil

  scalar_optimized(inner, input) ||
    generic_decode(type, inner, input, registry)
end

#encode(type, value_expr, registry) ⇒ Object



21
22
23
24
25
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 21

def encode(type, value_expr, registry)
  inner_of(type)
    &.then { Specialized.encode_expr(it, '_1', registry) }
    &.then { map_expr(it, value_expr) }
end

#identity_encoder?(type) ⇒ Boolean

Returns:

  • (Boolean)


34
35
36
37
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 34

def identity_encoder?(type)
  inner = inner_of(type) or return false
  Specialized.identity_encoder?(inner)
end

#inner_of(type) ⇒ Object



44
45
46
47
48
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 44

def inner_of(type)
  return nil unless Specialized.qname_of(type) == 'List.List'
  args = Specialized.args_of(type)
  args&.size == 1 ? args[0] : nil
end

#map_expr(elem, value_expr) ⇒ Object



27
28
29
30
31
32
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 27

def map_expr(elem, value_expr)
  case elem
  in ::String then "#{value_expr}.map { #{elem} }"
  in :identity then nil
  end
end

#specializable?(type, registry, seen) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
42
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 39

def specializable?(type, registry, seen)
  inner = inner_of(type) or return false
  Specialized.specializable_field?(inner, registry, seen)
end