Sha256: a0361bf3be45ed3a0bbd8650e4950b9c0957e5692f5440c9b01e4f8579186215
Contents?: true
Size: 1.58 KB
Versions: 1
Compression:
Stored size: 1.58 KB
Contents
module SoberSwag module Nodes ## # Base Node that all other nodes inherit from. # All nodes should define the following: # # - #deconstruct, which returns an array of *everything needed to idenitfy the node.* # We base comparisons on the result of deconstruction. # - #deconstruct_keys, which returns a hash of *everything needed to identify the node*. # We use this later. class Base include Comparable ## # Value-level comparison. def <=>(other) return other.class.name <=> self.class.name unless other.class == self.class deconstruct <=> other.deconstruct end def eql?(other) deconstruct == other.deconstruct end def hash deconstruct.hash end ## # Perform a catamorphism, or, a deep-first recursion. # # The basic way this works is deceptively simple: When you use 'cata' on a node, # it will call the block you gave it with the *deepest* nodes in the tree first. # It will then use the result of that block to reconstruct their *parent* node, and then # *call cata again* on the parent, and so on until we reach the top. # # When working with these definition nodes, we very often want to transform something recursively. # This method allows us to do so by focusing on a single level at a time, keeping the actual recursion *abstract*. def cata(&block) raise ArgumentError, 'Base is abstract' end def map(&block) raise ArgumentError, 'Base is abstract' end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
sober_swag-0.1.0 | lib/sober_swag/nodes/base.rb |