Module: Dry::Monads::RightBiased::Right

Includes:
Core::Constants
Included in:
Maybe::Some, Dry::Monads::Result::Success, Try::Value
Defined in:
lib/dry/monads/right_biased.rb

Overview

Right part

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(m) ⇒ Object


18
19
20
21
22
23
24
# File 'lib/dry/monads/right_biased.rb', line 18

def self.included(m)
  super

  def m.to_proc
    @to_proc ||= method(:new).to_proc
  end
end

Instance Method Details

#===(other) ⇒ Boolean

Parameters:

  • other (Object)

Returns:

  • (Boolean)

131
132
133
# File 'lib/dry/monads/right_biased.rb', line 131

def ===(other)
  self.class == other.class && value! === other.value!
end

#apply(val = Undefined) ⇒ RightBiased::Left, RightBiased::Right

Applies the stored value to the given argument if the argument has type of Right, otherwise returns the argument.

Examples:

happy path

create_user = Dry::Monads::Success(CreateUser.new)
name = Success("John")
create_user.apply(name) # equivalent to CreateUser.new.call("John")

unhappy path

name = Failure(:name_missing)
create_user.apply(name) # => Failure(:name_missing)

Returns:


121
122
123
124
125
126
127
# File 'lib/dry/monads/right_biased.rb', line 121

def apply(val = Undefined)
  unless @value.respond_to?(:call)
    raise TypeError, "Cannot apply #{ val.inspect } to #{ @value.inspect }"
  end

  Undefined.default(val) { yield }.fmap { |unwrapped| curry.(unwrapped) }
end

#bind(*args, **kwargs) ⇒ Object

Calls the passed in Proc object with value stored in self and returns the result.

If proc is nil, it expects a block to be given and will yield to it.

Examples:

Dry::Monads.Right(4).bind(&:succ) # => 5

Parameters:

  • args (Array<Object>)

    arguments that will be passed to a block if one was given, otherwise the first value assumed to be a Proc (callable) object and the rest of args will be passed to this object along with the internal value

Returns:

  • (Object)

    result of calling proc or block on the internal value


47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/dry/monads/right_biased.rb', line 47

def bind(*args, **kwargs)
  if args.empty? && !kwargs.empty?
    vargs, vkwargs = destructure(@value)
    kw = [kwargs.merge(vkwargs)]
  else
    vargs = [@value]
    kw = kwargs.empty? ? EMPTY_ARRAY : [kwargs]
  end

  if block_given?
    yield(*vargs, *args, *kw)
  else
    obj, *rest = args
    obj.(*vargs, *rest, *kw)
  end
end

#discardRightBiased::Right

Maps the value to Dry::Monads::Unit, useful when you don't care about the actual value.

Examples:

Dry::Monads::Success(:success).discard
# => Success(Unit)

Returns:


143
144
145
# File 'lib/dry/monads/right_biased.rb', line 143

def discard
  fmap { Unit }
end

#fmapRightBiased::Right

Abstract method for lifting a block over the monad type. Must be implemented for a right-biased monad.

Returns:

Raises:

  • (NotImplementedError)

81
82
83
# File 'lib/dry/monads/right_biased.rb', line 81

def fmap(*)
  raise NotImplementedError
end

#orRightBiased::Right

Ignores arguments and returns self. It exists to keep the interface identical to that of Left.

Returns:


89
90
91
# File 'lib/dry/monads/right_biased.rb', line 89

def or(*)
  self
end

#or_fmapRightBiased::Right

A lifted version of #or. For Dry::Monads::RightBiased::Right acts in the same way as #or, that is returns itselt.

Returns:


97
98
99
# File 'lib/dry/monads/right_biased.rb', line 97

def or_fmap(*)
  self
end

#tee(*args, &block) ⇒ RightBiased::Right

Does the same thing as #bind except it returns the original monad when the result is a Right.

Examples:

Dry::Monads.Right(4).tee { Right('ok') } # => Right(4)
Dry::Monads.Right(4).tee { Left('fail') } # => Left('fail')

Parameters:

  • args (Array<Object>)

    arguments will be transparently passed through to #bind

Returns:


73
74
75
# File 'lib/dry/monads/right_biased.rb', line 73

def tee(*args, &block)
  bind(*args, &block).bind { self }
end

#value!Object

Unwraps the underlying value

Returns:

  • (Object)

29
30
31
# File 'lib/dry/monads/right_biased.rb', line 29

def value!
  @value
end

#value_or(_val = nil) ⇒ Object

Returns value. It exists to keep the interface identical to that of RightBiased::Left

Returns:

  • (Object)

104
105
106
# File 'lib/dry/monads/right_biased.rb', line 104

def value_or(_val = nil)
  @value
end