module Rstructural::ADT
Public Class Methods
extended(klass)
click to toggle source
# File lib/rstructural/adt.rb, line 6 def self.extended(klass) klass.class_variable_set(:@@adt_types, []) klass.class_variable_set(:@@adt_super_class, klass) end
Public Instance Methods
const(value = nil, &block)
click to toggle source
# File lib/rstructural/adt.rb, line 11 def const(value = nil, &block) if value Rstructural::Struct.new(:value, __caller: caller, &block).new(value) else Rstructural::Struct.new(__caller: caller, &block).new end.tap do |k| self.class_variable_get(:@@adt_types) << k k.class.include(self.class_variable_get(:@@adt_super_class)) def k.name self.class.name end end end
data(*fields, &block)
click to toggle source
# File lib/rstructural/adt.rb, line 26 def data(*fields, &block) Rstructural::Struct.new(*fields, __caller: caller, &block).tap do |k| k.include(self.class_variable_get(:@@adt_super_class)) self.class_variable_get(:@@adt_types) << k end end
interface(&block)
click to toggle source
# File lib/rstructural/adt.rb, line 33 def interface(&block) self.class_variable_get(:@@adt_types).each do |t| case t in Class t.class_eval(&block) else t.class.class_eval(&block) end end end