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 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
@@ -0,0 +1,3 @@
1
+ if (! defined? Result)
2
+ require File.join(File.dirname(__FILE__), 'result')
3
+ end
@@ -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
@@ -0,0 +1,9 @@
1
+ class Result::Err
2
+ def initialize(value)
3
+ @value = value
4
+ end
5
+
6
+ def extract
7
+ @value
8
+ end
9
+ end
@@ -0,0 +1,3 @@
1
+
2
+ class Result::ResultError < StandardError; end
3
+ class Result::InvalidReturn < Result::ResultError; end
data/lib/result/ok.rb ADDED
@@ -0,0 +1,9 @@
1
+ class Result::Ok
2
+ def initialize(value)
3
+ @value = value
4
+ end
5
+
6
+ def extract
7
+ @value
8
+ end
9
+ end
@@ -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: []