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