module Monads::Monad

Public Instance Methods

method_missing(*args, &block) click to toggle source
# File lib/monads/monad.rb, line 9
def method_missing(*args, &block)
  within do |value|
    value.public_send(*args, &block)
  end
end
within(&block) click to toggle source
# File lib/monads/monad.rb, line 3
def within(&block)
  and_then do |value|
    self.class.from_value(block.call(value))
  end
end

Private Instance Methods

ensure_monadic_result(&block) click to toggle source
# File lib/monads/monad.rb, line 17
def ensure_monadic_result(&block)
  acceptable_result_type = self.class

  ->(*a, &b) do
    block.call(*a, &b).tap do |result|
      unless result.is_a?(acceptable_result_type)
        raise TypeError, "block must return #{acceptable_result_type.name}"
      end
    end
  end
end