module Dry::Monads::Transformer

Advanced tranformations.

Public Instance Methods

fmap2(*args) { |b, *args| ... } click to toggle source

Lifts a block/proc over the 2-level nested structure. This is essentially fmap . fmap (. is the function composition operator from Haskell) or the functor instance for a two-level monadic structure like List Either.

@example

List[Right(1), Left(1)].fmap2 { |x| x + 1 } # => List[Right(2), Left(1)]
Right(None).fmap2 { |x| x + 1 } # => Right(None)

@param args [Array<Object>] arguments will be passed to the block or the proc @return [Object] some monadic value

# File lib/dry/monads/transformer.rb, line 18
def fmap2(*args)
  if block_given?
    fmap { |a| a.fmap { |b| yield(b, *args) } }
  else
    func, *rest = args
    fmap { |a| a.fmap { |b| func.(b, *rest) } }
  end
end
fmap3(*args) { |c, *args| ... } click to toggle source

Lifts a block/proc over the 3-level nested structure.

@example

List[Right(Some(1)), Left(Some(1))].fmap3 { |x| x + 1 }
# => List[Right(Some(2)), Left(Some(1))]
Right(None).fmap3 { |x| x + 1 } # => Right(None)

@param args [Array<Object>] arguments will be passed to the block or the proc @return [Object] some monadic value

# File lib/dry/monads/transformer.rb, line 36
def fmap3(*args)
  if block_given?
    fmap { |a| a.fmap { |b| b.fmap { |c| yield(c, *args) } } }
  else
    func, *rest = args
    fmap { |a| a.fmap { |b| b.fmap { |c| func.(c, *rest) } } }
  end
end