Sha256: ae5298f0d69d817c8e2f470035037aa902a054e0fd655fff60cb8eee6a2fdc1c

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

require_relative 'lambda_block'

class Proc
  def or_exception
    -> (value) {
      begin
        right(self.(value))
      rescue Exception => e
        left(e)
      end
    }
  end
end

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

  def flatten
    flat_map(identity)
  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 flat_map(fn=nil, &block) # a function which returns an either
    assert_funcs(fn, block_given?)
    self
  end

  def fold(seed, fn_left, fn_right)
    fn_left.(seed, @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 flat_map(fn=nil, &block) # a function which returns an either
    assert_funcs(fn, block_given?)
    block_given? ? block.call(@value) : fn.(@value)
  end

  def fold(seed, fn_left, fn_right)
    fn_right.(seed, @value)
  end

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

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
totally_lazy-0.1.32 lib/totally_lazy/either.rb
totally_lazy-0.1.31 lib/totally_lazy/either.rb