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
26
27
# File 'lib/jade/codegen/boundary/specialized/list.rb', line 21

def encode(type, value_expr, registry)
  inner = inner_of(type) or return nil
  return nil if Specialized.identity_encoder?(inner)

  elem = Specialized.encode_expr(inner, '_1', registry) or return nil
  "#{value_expr}.map { #{elem} }"
end

#identity_encoder?(type) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#inner_of(type) ⇒ Object



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

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

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

Returns:

  • (Boolean)


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

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