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