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

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?

Returns:

  • (Boolean)


161
162
163
# File 'lib/obfusk/adt.rb', line 161

def eql?(rhs)
  self == rhs
end

#initializeObject

use a contructor!

Raises:

  • NoMethodError



30
31
32
# File 'lib/obfusk/adt.rb', line 30

def initialize
  raise NoMethodError, 'use a contructor!'  # TODO
end

#inspectObject

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_sObject

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