Module: Philiprehberger::Result

Defined in:
lib/philiprehberger/result.rb,
lib/philiprehberger/result/ok.rb,
lib/philiprehberger/result/err.rb,
lib/philiprehberger/result/version.rb,
lib/philiprehberger/result/tappable.rb,
lib/philiprehberger/result/filterable.rb

Defined Under Namespace

Modules: Filterable, Tappable Classes: Err, Error, Ok, UnwrapError

Constant Summary collapse

VERSION =
'0.6.0'

Class Method Summary collapse

Class Method Details

.all(results) ⇒ Ok, Err

Combine an array of results into a single result.

Parameters:

  • results (Array<Ok, Err>)

    the results to combine

Returns:

  • (Ok, Err)

    Ok with array of values, or Err with first error



44
45
46
47
48
49
50
51
52
# File 'lib/philiprehberger/result.rb', line 44

def self.all(results)
  values = []
  results.each do |result|
    return result if result.err?

    values << result.value
  end
  Ok.new(values)
end

.any(results) ⇒ Ok, Err

Return the first Ok result, or Err with all errors if all fail

Parameters:

  • results (Array<Ok, Err>)

    results to check

Returns:

  • (Ok, Err)

    first Ok, or Err with array of all errors



69
70
71
72
# File 'lib/philiprehberger/result.rb', line 69

def self.any(results)
  results.each { |r| return r if r.ok? }
  err(results.select(&:err?).map { |r| r.instance_variable_get(:@error) })
end

.err(error) ⇒ Err

Create a failure result.

Parameters:

  • error

    the error value

Returns:



26
# File 'lib/philiprehberger/result.rb', line 26

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

.flatten(result) ⇒ Ok, Err

Flatten a nested Result. Ok(Ok(v)) becomes Ok(v), Ok(Err(e)) becomes Err(e).

Parameters:

  • result (Ok, Err)

    the result to flatten

Returns:

  • (Ok, Err)

    the flattened result



58
59
60
61
62
63
# File 'lib/philiprehberger/result.rb', line 58

def self.flatten(result)
  return result if result.err?
  return result.value if result.value.is_a?(Ok) || result.value.is_a?(Err)

  result
end

.ok(value) ⇒ Ok

Create a success result.

Parameters:

  • value

    the success value

Returns:



20
# File 'lib/philiprehberger/result.rb', line 20

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

.partition(results) ⇒ Array(Array, Array)

Split an array of results into success values and error values.

Parameters:

  • results (Array<Ok, Err>)

    results to partition

Returns:

  • (Array(Array, Array))

    two-element array: [ok_values, err_values]



78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/philiprehberger/result.rb', line 78

def self.partition(results)
  values = []
  errors = []
  results.each do |result|
    if result.ok?
      values << result.value
    else
      errors << result.instance_variable_get(:@error)
    end
  end
  [values, errors]
end

.try(*exceptions) { ... } ⇒ Ok, Err

Wrap a block, capturing exceptions as Err.

Parameters:

  • exceptions (Array<Class>)

    exception classes to catch (default: StandardError)

Yields:

  • the block to execute

Returns:



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

def self.try(*exceptions, &block)
  exceptions = [StandardError] if exceptions.empty?
  Ok.new(block.call)
rescue *exceptions => e
  Err.new(e)
end