module Obfusk::ADT

Algebraic Data Type

Public Class Methods

included(base) click to toggle source
# File lib/obfusk/adt.rb, line 24
def self.included(base)
  base.extend ClassMethods
end
new() click to toggle source

use a contructor! @raise NoMethodError

# File lib/obfusk/adt.rb, line 30
def initialize
  raise NoMethodError, 'use a contructor!'  # TODO
end

Public Instance Methods

<=>(rhs) click to toggle source

ordering

# File lib/obfusk/adt.rb, line 166
def <=>(rhs)
  return nil unless rhs.is_a?(::Obfusk::ADT) &&
                    self.class.superclass == rhs.class.superclass
  k = self.class.superclass.constructors.keys
  __adt_ctor__ != rhs.__adt_ctor__ ?
    k.index(__adt_ctor_name__) <=> k.index(rhs.__adt_ctor_name__) :
    _compare_data(rhs)
end
==(rhs) click to toggle source

equal?

# File lib/obfusk/adt.rb, line 154
def ==(rhs)
  rhs.is_a?(::Obfusk::ADT) &&
    self.class.superclass == rhs.class.superclass &&
    __adt_ctor__ == rhs.__adt_ctor__ && _eq_data(rhs)
end
__adt_ctor__() click to toggle source
# File lib/obfusk/adt.rb, line 136
def __adt_ctor__
  @ctor
end
__adt_ctor_keys__() click to toggle source
# File lib/obfusk/adt.rb, line 144
def __adt_ctor_keys__
  @ctor_keys
end
__adt_ctor_name__() click to toggle source
# File lib/obfusk/adt.rb, line 140
def __adt_ctor_name__
  @ctor_name
end
__adt_data__() click to toggle source

the data

# File lib/obfusk/adt.rb, line 149
def __adt_data__
  @data
end
_compare_data(rhs) click to toggle source
# File lib/obfusk/adt.rb, line 179
def _compare_data(rhs)
  __adt_data__.values_at(*__adt_ctor_keys__) <=>
    rhs.__adt_data__.values_at(*__adt_ctor_keys__)
end
_eq_data(rhs) click to toggle source
# File lib/obfusk/adt.rb, line 175
def _eq_data(rhs)
  __adt_data__ == rhs.__adt_data__
end
clone(merge_data = {}) click to toggle source

clone

# File lib/obfusk/adt.rb, line 130
def clone(merge_data = {})
  merge_data.empty? ? self :
    self.class.superclass.new(__adt_ctor_name__,
                              __adt_data__.merge(merge_data))
end
eql?(rhs) click to toggle source

equal and of the same type?

# File lib/obfusk/adt.rb, line 161
def eql?(rhs)
  self == rhs
end
inspect() click to toggle source

to string

# File lib/obfusk/adt.rb, line 201
def inspect
  to_s
end
match(opts) click to toggle source

pattern matching

# File lib/obfusk/adt.rb, line 185
def match(opts)
  unless (ck = self.class.superclass.constructors.keys.sort) ==
         (ok = opts.keys.sort)
    raise ArgumentError,
      "constructors do not match (#{ok} for #{ck})"
  end
  opts[__adt_ctor_name__][self]
end
to_s() click to toggle source

to string

# File lib/obfusk/adt.rb, line 195
def to_s
  n = self.class.superclass.name || '#ADT'
  "#<#{n}.#{__adt_ctor_name__}: #{__adt_data__}>"
end