Class: SoberSwag::Nodes::Base Abstract

Inherits:
Object
  • Object
show all
Includes:
Comparable
Defined in:
lib/sober_swag/nodes/base.rb

Overview

This class is abstract.

Base Node that all other nodes inherit from. All nodes should define the following:

  • #deconstruct, which returns an array of everything needed to identify 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.

Direct Known Subclasses

Array, Attribute, Binary, Enum, List, Primitive

Instance Method Summary collapse

Instance Method Details

#<=>(other) ⇒ Integer

Value-level comparison. Returns -1, 0, or +1 if this object is less than, equal to, or greater than other.

Parameters:

  • other (Object)

    the other object

Returns:

  • (Integer)

    comparison result



25
26
27
28
29
# File 'lib/sober_swag/nodes/base.rb', line 25

def <=>(other)
  return other.class.name <=> self.class.name unless other.instance_of?(self.class)

  deconstruct <=> other.deconstruct
end

#cata {|node| ... } ⇒ Object

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.

Yield Parameters:

  • node

    nodes contained within this node, from the bottom-up. This block will first transform the innermost node, then the second layer, and so on, until we get to the node you originally called #cata on.

Yield Returns:

  • (Object)

    the object you wish to transform into.

Raises:

  • (ArgumentError)


60
61
62
# File 'lib/sober_swag/nodes/base.rb', line 60

def cata
  raise ArgumentError, 'Base is abstract'
end

#eql?(other) ⇒ Boolean

Is this object equal to the other object?

Parameters:

  • other (Object)

    the object to compare

Returns:

  • (Boolean)

    yes or no



35
36
37
# File 'lib/sober_swag/nodes/base.rb', line 35

def eql?(other)
  deconstruct == other.deconstruct
end

#hashInteger

Standard hash key.

Returns:

  • (Integer)


42
43
44
# File 'lib/sober_swag/nodes/base.rb', line 42

def hash
  deconstruct.hash
end

#mapObject

Map over the inner, contained type of this node. This will only map over values wrapped in a SoberSwag::Nodes::Primitive object. Unlike #cata, it does not transform the entire node tree.

Raises:

  • (ArgumentError)


68
69
70
# File 'lib/sober_swag/nodes/base.rb', line 68

def map
  raise ArgumentError, 'Base is abstract'
end