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