Sha256: acbc5afac8df4fc1d2990bf43dc8610ad8cc7831fa96f9d64a0cc032779fdd6d

Contents?: true

Size: 1.25 KB

Versions: 5

Compression:

Stored size: 1.25 KB

Contents

require 'kleisli/monad'
require 'kleisli/maybe'

module Kleisli
  class Either < Monad
    attr_reader :right, :left

    def ==(other)
      right == other.right && left == other.left
    end

    def *(other)
      self >-> f {
        other >-> val {
          Right(f.arity > 1 ? f.curry.call(val) : f.call(val))
        }
      }
    end

    class Right < Either
      alias value right

      def initialize(right)
        @right = right
      end

      def >(f)
        f.call(@right)
      end

      def fmap(&f)
        Right.new(f.call(@right))
      end

      def to_maybe
        Maybe::Some.new(@right)
      end

      def or(other, &other_blk)
        self
      end
    end

    class Left < Either
      alias value left

      def initialize(left)
        @left = left
      end

      def >(f)
        self
      end

      def fmap(&f)
        self
      end

      def to_maybe
        Maybe::None.new
      end

      def or(other, &other_blk)
        if other_blk
          other_blk.call(@left)
        else
          other
        end
      end
    end
  end
end

Right = Kleisli::Either::Right.method(:new)
Left = Kleisli::Either::Left.method(:new)

def Right(v)
  Kleisli::Either::Right.new(v)
end

def Left(v)
  Kleisli::Either::Left.new(v)
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
kleisli-0.2.4 lib/kleisli/either.rb
kleisli-0.2.3 lib/kleisli/either.rb
kleisli-0.2.2 lib/kleisli/either.rb
kleisli-0.2.1 lib/kleisli/either.rb
kleisli-0.2.0 lib/kleisli/either.rb