rb-result 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/rb-result.rb +3 -0
- data/lib/result/case.rb +19 -0
- data/lib/result/err.rb +9 -0
- data/lib/result/errors.rb +3 -0
- data/lib/result/ok.rb +9 -0
- data/lib/result/rspec/matchers.rb +15 -0
- data/lib/result.rb +87 -0
- metadata +63 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: '00118f10a77ea48120c06db8c3f9dc385f57d0e5dc2e308797ab38493566db2a'
|
|
4
|
+
data.tar.gz: c037af2563921a27a99150fc55e7c6a5f474deb2940a8adf44ef42713b57fcce
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 2b89d8dd6d75ee654aa90db72afd0dd4839988a9a2d508cbafa2739abf365c100cc110c2600b70600560f4c44ea06a7612e3c6b1cf51947107987b4c22aeed3e
|
|
7
|
+
data.tar.gz: d6f8dce794ac4e4998282dd836b25778a441ad8bfa262a774c1a54b9b363e7746bb10736a1f4808f4f201e9398b828f0ed6f2f19db9d81c767b3e8ad6a3bb7b8
|
data/lib/rb-result.rb
ADDED
data/lib/result/case.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Result::Case
|
|
2
|
+
def initialize(result, ok_block:)
|
|
3
|
+
@result = result
|
|
4
|
+
@ok_block = ok_block
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def self.when_ok(result, &block)
|
|
8
|
+
new(result, ok_block: block)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def when_error(&block)
|
|
12
|
+
case @result.send(:_result)
|
|
13
|
+
when Result::Ok
|
|
14
|
+
@ok_block.call(@result.send(:_result).extract)
|
|
15
|
+
when Result::Err
|
|
16
|
+
block.call(@result.send(:_result).extract)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/result/err.rb
ADDED
data/lib/result/ok.rb
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
RSpec::Matchers.define :be_an_ok_result do |expected|
|
|
2
|
+
match do |actual|
|
|
3
|
+
expect(actual).to be_kind_of(Result)
|
|
4
|
+
expect(actual).to be_ok
|
|
5
|
+
expect(actual.when_ok(&:itself).when_error { Unreachable }).to eql expected
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
RSpec::Matchers.define :be_an_error_result do |expected|
|
|
10
|
+
match do |actual|
|
|
11
|
+
expect(actual).to be_kind_of(Result)
|
|
12
|
+
expect(actual).to be_error
|
|
13
|
+
expect(actual.when_ok { Unreachable }.when_error(&:itself)).to eql expected
|
|
14
|
+
end
|
|
15
|
+
end
|
data/lib/result.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
class Result
|
|
2
|
+
def initialize(result)
|
|
3
|
+
@result = result
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.ok(successful_thing)
|
|
7
|
+
new(Ok.new(successful_thing))
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.error(errored_thing)
|
|
11
|
+
new(Err.new(errored_thing))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def map
|
|
15
|
+
case @result
|
|
16
|
+
when Ok
|
|
17
|
+
self.class.ok(yield @result.extract)
|
|
18
|
+
when Err
|
|
19
|
+
self
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def then
|
|
24
|
+
case @result
|
|
25
|
+
when Ok
|
|
26
|
+
yield(@result.extract).tap do |returned_result|
|
|
27
|
+
unless returned_result.is_a?(self.class)
|
|
28
|
+
raise InvalidReturn, 'then handler must return a Result'
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
when Err
|
|
32
|
+
self
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def map_error
|
|
37
|
+
case @result
|
|
38
|
+
when Err
|
|
39
|
+
self.class.error(yield @result.extract)
|
|
40
|
+
when Ok
|
|
41
|
+
self
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def ok?
|
|
46
|
+
@result.is_a?(Ok)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def error?
|
|
50
|
+
@result.is_a?(Err)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def when_ok(&block)
|
|
54
|
+
Case.when_ok(self, &block)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.combine_map(list)
|
|
58
|
+
list.reduce(self.ok []) do |acc, item|
|
|
59
|
+
break acc if acc.error?
|
|
60
|
+
|
|
61
|
+
result = yield item
|
|
62
|
+
|
|
63
|
+
map2(acc, result) do |acc_list, result_item|
|
|
64
|
+
acc_list + [result_item]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.map2(first_result, second_result)
|
|
70
|
+
first_result.then do |first|
|
|
71
|
+
second_result.then do |second|
|
|
72
|
+
self.ok yield first, second
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
|
|
79
|
+
def _result
|
|
80
|
+
@result
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
require 'result/case'
|
|
85
|
+
require 'result/err'
|
|
86
|
+
require 'result/errors'
|
|
87
|
+
require 'result/ok'
|
metadata
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: rb-result
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.2
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Agustin Cornu
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2021-09-17 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rspec
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
description: Provides a wrapper for computations that may fail
|
|
28
|
+
email: agustincornu@fastmail.com
|
|
29
|
+
executables: []
|
|
30
|
+
extensions: []
|
|
31
|
+
extra_rdoc_files: []
|
|
32
|
+
files:
|
|
33
|
+
- lib/rb-result.rb
|
|
34
|
+
- lib/result.rb
|
|
35
|
+
- lib/result/case.rb
|
|
36
|
+
- lib/result/err.rb
|
|
37
|
+
- lib/result/errors.rb
|
|
38
|
+
- lib/result/ok.rb
|
|
39
|
+
- lib/result/rspec/matchers.rb
|
|
40
|
+
homepage:
|
|
41
|
+
licenses:
|
|
42
|
+
- MIT
|
|
43
|
+
metadata: {}
|
|
44
|
+
post_install_message:
|
|
45
|
+
rdoc_options: []
|
|
46
|
+
require_paths:
|
|
47
|
+
- lib
|
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - ">="
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '0'
|
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
|
+
requirements:
|
|
55
|
+
- - ">="
|
|
56
|
+
- !ruby/object:Gem::Version
|
|
57
|
+
version: '0'
|
|
58
|
+
requirements: []
|
|
59
|
+
rubygems_version: 3.1.4
|
|
60
|
+
signing_key:
|
|
61
|
+
specification_version: 4
|
|
62
|
+
summary: Hola!
|
|
63
|
+
test_files: []
|