Module: Obfusk::ADT
- Includes:
- Comparable
- Included in:
- List, Monads::Either, Monads::Identity, Monads::Maybe, Monads::State, Monads::State::Pair
- Defined in:
- lib/obfusk/adt.rb
Overview
Algebraic Data Type
Defined Under Namespace
Modules: ClassMethods, Constructor
Class Method Summary collapse
Instance Method Summary collapse
-
#<=>(rhs) ⇒ Object
ordering.
-
#==(rhs) ⇒ Object
equal?.
- #__adt_ctor__ ⇒ Object
- #__adt_ctor_keys__ ⇒ Object
- #__adt_ctor_name__ ⇒ Object
-
#__adt_data__ ⇒ Object
the data.
- #_compare_data(rhs) ⇒ Object
- #_eq_data(rhs) ⇒ Object
-
#clone(merge_data = {}) ⇒ Object
clone.
-
#eql?(rhs) ⇒ Boolean
equal and of the same type?.
-
#initialize ⇒ Object
use a contructor!.
-
#inspect ⇒ Object
to string.
-
#match(opts) ⇒ Object
pattern matching.
-
#to_s ⇒ Object
to string.
Class Method Details
.included(base) ⇒ Object
24 25 26 |
# File 'lib/obfusk/adt.rb', line 24 def self.included(base) base.extend ClassMethods end |
Instance Method Details
#<=>(rhs) ⇒ Object
ordering
166 167 168 169 170 171 172 173 |
# 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) ⇒ Object
equal?
154 155 156 157 158 |
# 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__ ⇒ Object
136 137 138 |
# File 'lib/obfusk/adt.rb', line 136 def __adt_ctor__ @ctor end |
#__adt_ctor_keys__ ⇒ Object
144 145 146 |
# File 'lib/obfusk/adt.rb', line 144 def __adt_ctor_keys__ @ctor_keys end |
#__adt_ctor_name__ ⇒ Object
140 141 142 |
# File 'lib/obfusk/adt.rb', line 140 def __adt_ctor_name__ @ctor_name end |
#__adt_data__ ⇒ Object
the data
149 150 151 |
# File 'lib/obfusk/adt.rb', line 149 def __adt_data__ @data end |
#_compare_data(rhs) ⇒ Object
179 180 181 182 |
# 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) ⇒ Object
175 176 177 |
# File 'lib/obfusk/adt.rb', line 175 def _eq_data(rhs) __adt_data__ == rhs.__adt_data__ end |
#clone(merge_data = {}) ⇒ Object
clone
130 131 132 133 134 |
# 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) ⇒ Boolean
equal and of the same type?
161 162 163 |
# File 'lib/obfusk/adt.rb', line 161 def eql?(rhs) self == rhs end |
#initialize ⇒ Object
use a contructor!
30 31 32 |
# File 'lib/obfusk/adt.rb', line 30 def initialize raise NoMethodError, 'use a contructor!' # TODO end |
#inspect ⇒ Object
to string
201 202 203 |
# File 'lib/obfusk/adt.rb', line 201 def inspect to_s end |
#match(opts) ⇒ Object
pattern matching
185 186 187 188 189 190 191 192 |
# 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 ⇒ Object
to string
195 196 197 198 |
# File 'lib/obfusk/adt.rb', line 195 def to_s n = self.class.superclass.name || '#ADT' "#<#{n}.#{__adt_ctor_name__}: #{__adt_data__}>" end |