Module: Jade::Codegen::Boundary::Specialized::Maybe

Extended by:
Maybe
Included in:
Maybe
Defined in:
lib/jade/codegen/boundary/specialized/maybe.rb

Overview

‘Maybe(t)` where `t` is itself specializable. Both decode and encode bind the input via `.then { it … }` so a complex `value_expr` (e.g. a full `Internal.X(…)` call) isn’t re-evaluated.

Instance Method Summary collapse

Instance Method Details

#decode(type, input, registry) ⇒ Object



12
13
14
15
16
17
# File 'lib/jade/codegen/boundary/specialized/maybe.rb', line 12

def decode(type, input, registry)
  inner = inner_of(type) or return nil
  elem = Specialized.decode_expr(inner, 'it', registry) or return nil

  "#{input}.then { it.nil? ? Jade::Maybe::Nothing[] : Jade::Maybe::Just[#{elem}] }"
end

#encode(type, value_expr, registry) ⇒ Object



19
20
21
22
23
24
# File 'lib/jade/codegen/boundary/specialized/maybe.rb', line 19

def encode(type, value_expr, registry)
  inner = inner_of(type) or return nil
  inner_enc = Specialized.encode_expr(inner, 'it._1', registry) || 'it._1'

  "#{value_expr}.then { it.is_a?(::Jade::Maybe::Just) ? #{inner_enc} : nil }"
end

#inner_of(type) ⇒ Object



31
32
33
34
35
# File 'lib/jade/codegen/boundary/specialized/maybe.rb', line 31

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

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

Returns:

  • (Boolean)


26
27
28
29
# File 'lib/jade/codegen/boundary/specialized/maybe.rb', line 26

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