Class: Decoding::Result Abstract

Inherits:
Object
  • Object
show all
Defined in:
lib/decoding/result.rb

Overview

This class is abstract.

A result represent the outcome of some computation that can succeed or fail. The results are represented with two subclasses of Result: Ok and Err. Each hold a single result value.

The use of a result is the common interface provided to callers for transforming or chaining result values.

Direct Known Subclasses

Err, Ok

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(value) ⇒ Result

Returns a new instance of Result.



49
50
51
52
53
# File 'lib/decoding/result.rb', line 49

def initialize(value)
  @value = value
  @hash = [self.class, value].hash
  freeze
end

Instance Attribute Details

#hashObject (readonly)



47
48
49
# File 'lib/decoding/result.rb', line 47

def hash
  @hash
end

Class Method Details

.all(results) ⇒ Result<a>

Collapse array of result values into a single result, or return the first Err value.

Examples:

all(Ok(1), Ok(2)) # => Ok([1, 2])
all(Ok(1), Err("error")) # => Err("error")

Parameters:

Returns:



33
34
35
36
37
# File 'lib/decoding/result.rb', line 33

def self.all(results)
  results.reduce(ok([])) do |acc, el|
    acc.and(el.to_result) { [*_1, _2] }
  end
end

.err(value) ⇒ Decoding::Err<a>

Construct a new Err value with the given value.

Parameters:

  • value (a)

Returns:



23
# File 'lib/decoding/result.rb', line 23

def self.err(value) = Err.new(value)

.ok(value) ⇒ Decoding::Ok<a>

Construct a new Ok value with the given value.

Parameters:

  • value (a)

Returns:



17
# File 'lib/decoding/result.rb', line 17

def self.ok(value) = Ok.new(value)

Instance Method Details

#and(other) {|left, right| ... } ⇒ Decoding::Result<c>

Combine two Result values if they are both Ok using the given block, or return the first Err value.

Parameters:

Yield Parameters:

  • left (Object)
  • right (Object)

Yield Returns:

  • (c)

Returns:



113
# File 'lib/decoding/result.rb', line 113

def and(_) = self

#and_then {|value| ... } ⇒ Decoding::Result<a>

Transform a result using a block that will also return a result.

Yield Parameters:

  • value (Object)

Yield Returns:

Returns:



120
# File 'lib/decoding/result.rb', line 120

def and_then = self

#eql?(other) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


55
56
57
# File 'lib/decoding/result.rb', line 55

def eql?(other)
  other.is_a?(self.class) && value == other.value
end

#err?Boolean

Whether this value is an Err value.

Returns:

  • (Boolean)


72
# File 'lib/decoding/result.rb', line 72

def err? = false

#inspectObject



60
61
62
# File 'lib/decoding/result.rb', line 60

def inspect
  "#<#{self.class} #{value.inspect}>"
end

#map {|value| ... } ⇒ Decoding::Result<b>

Create a new Result value for the result of the block applied to this result's value. Err values are returned as-is.

Examples:

Result.ok(123).map { |i| i * 2 } # => Ok(246)
Result.err("error").map { |i| i * 2 } # => Err("error")

Yield Parameters:

  • value (a)

Yield Returns:

  • (b)

Returns:



91
# File 'lib/decoding/result.rb', line 91

def map = self

#map_err {|value| ... } ⇒ Decoding::Result<b>

Create a new Result value for the result of the block applied to this result's value. Ok values are returned as-is.

Examples:

Result.ok(123).map { |s| s.upcase } # => Ok(123)
Result.err("error").map { |s| s.upcase } # => Err("ERROR")

Yield Parameters:

  • value (a)

Yield Returns:

  • (b)

Returns:



102
# File 'lib/decoding/result.rb', line 102

def map_err = self

#ok?Boolean

Whether this value is an Ok value.

Returns:

  • (Boolean)


67
# File 'lib/decoding/result.rb', line 67

def ok? = false

#to_resultObject



122
# File 'lib/decoding/result.rb', line 122

def to_result = self

#unwrap(default_value) ⇒ Object

Extract the value out of a Result value. In case of an Ok, this returns the result's value. In case of an Err, the given default_value is returned.

Parameters:

  • default_value (Object)

Returns:

  • (Object)


80
# File 'lib/decoding/result.rb', line 80

def unwrap(default_value) = default_value