lib/qrb/syntax/contract.rb in qrb-0.2.0 vs lib/qrb/syntax/contract.rb in qrb-0.3.0

- old
+ new

@@ -1,24 +1,36 @@ module Qrb module Syntax module Contract def compile(factory, clazz) - contract = [ - type.compile(factory), - compile_upper(factory, clazz) - ] + contract = [ type.compile(factory) ] + compile_pair(factory, clazz) { contract_name.to_sym => contract } end - def compile_upper(factory, clazz) - if up - up.compile(factory) + def compile_pair(factory, clazz) + if pair + pair.compile(factory) elsif clazz - clazz.method(contract_name.to_sym) + dresser = clazz.method(contract_name.to_sym) + undresser = clazz.instance_method(:"to_#{contract_name}") + [ + dresser, + ->(d){ undresser.bind(d).call } + ] else - Qrb::IDENTITY + [ Qrb::IDENTITY, Qrb::IDENTITY ] end + end + + def to_ast + ast = [ + :contract, + contract_name.to_s, + (type && type.to_ast) + ] + ast << pair.to_ast if pair + ast end end # module Contract end # module Syntax end # module Qrb