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 |