Sha256: 55c6fdcb73fc991c29a8e8f34d3f7af1a999b9b59b0649f11e361776ce015333

Contents?: true

Size: 1.33 KB

Versions: 1

Compression:

Stored size: 1.33 KB

Contents

require_relative 'lambda_block'

module Eithers
  private
  def left(value)
    Either.left(value)
  end

  def right(value)
    Either.right(value)
  end
end

class Either
  include Comparable
  include LambdaBlock

  def self.left(value)
    Left.new(value)
  end

  def self.right(value)
    Right.new(value)
  end
end

class Left < Either
  def initialize(value)
    @value = value
  end

  def is_left?
    true
  end

  def is_right?
    false
  end

  def left_value
    @value
  end

  def right_value
    raise NoSuchElementException.new
  end

  def map_lr(fn_left, fn_right)
    fn_left.(@value)
  end

  def map_left(fn=nil, &block)
    assert_funcs(fn, block_given?)
    left(block_given? ? block.call(@value) : fn.(@value))
  end

  def <=>(other)
    @value <=> other.left_value
  end
end

class Right < Either
  def initialize(value)
    @value = value
  end

  def is_left?
    false
  end

  def is_right?
    true
  end

  def left_value
    raise NoSuchElementException.new
  end

  def right_value
    @value
  end

  def map(fn=nil, &block)
    assert_funcs(fn, block_given?)
    right(block_given? ? block.call(@value) : fn.(@value))
  end

  def map_lr(fn_left, fn_right)
    fn_right.(@value)
  end

  def map_left(fn=nil, &block)
    assert_funcs(fn, block_given?)
    self
  end

  def <=>(other)
    @value <=> other.right_value
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
totally_lazy-0.1.28 lib/totally_lazy/either.rb