resonad 1.0.2 → 1.1.0
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 +4 -4
- data/lib/resonad.rb +44 -31
- data/lib/resonad/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 350f8a5aeb12b9502c1a6c6e9bdc1b9741dde935
|
4
|
+
data.tar.gz: eb0c4b2ea23b9f589b46c4261ff85aae5ac2effd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66aaebdf2b1ba74598c85e54d605f755d18672cf241f464a59fd640d2835feee7cd1f91ae7266d581391be0220b12a72ce6d19c5940af98823fab05b59fb3112
|
7
|
+
data.tar.gz: bfaf318864e49273aec6ca07f2200b42203cc78841f809511dc8afce51347ef19c23a6fda5cff13e43598c030be7c53ec5c437cf91a48398264f386bad620d61
|
data/lib/resonad.rb
CHANGED
@@ -1,28 +1,19 @@
|
|
1
|
-
|
1
|
+
class Resonad
|
2
2
|
class NonExistentError < StandardError; end
|
3
3
|
class NonExistentValue < StandardError; end
|
4
4
|
|
5
|
-
|
6
|
-
Success
|
7
|
-
|
8
|
-
|
9
|
-
def self.Failure(*args)
|
10
|
-
Failure.new(*args)
|
11
|
-
end
|
5
|
+
module Mixin
|
6
|
+
def Success(*args)
|
7
|
+
::Resonad::Success.new(*args)
|
8
|
+
end
|
12
9
|
|
13
|
-
|
14
|
-
|
15
|
-
rescue Exception => e
|
16
|
-
if exception_classes.empty?
|
17
|
-
Failure(e) # rescue from all exceptions
|
18
|
-
elsif exception_classes.any? { |klass| e.is_a?(klass) }
|
19
|
-
Failure(e) # rescue from specified exception type
|
20
|
-
else
|
21
|
-
raise # reraise unhandled exception
|
10
|
+
def Failure(*args)
|
11
|
+
::Resonad::Failure.new(*args)
|
22
12
|
end
|
23
13
|
end
|
14
|
+
extend Mixin
|
24
15
|
|
25
|
-
class Success
|
16
|
+
class Success < Resonad
|
26
17
|
attr_accessor :value
|
27
18
|
|
28
19
|
def initialize(value)
|
@@ -34,10 +25,6 @@ module Resonad
|
|
34
25
|
true
|
35
26
|
end
|
36
27
|
|
37
|
-
def failure?
|
38
|
-
false
|
39
|
-
end
|
40
|
-
|
41
28
|
def on_success
|
42
29
|
yield value
|
43
30
|
self
|
@@ -67,15 +54,13 @@ module Resonad
|
|
67
54
|
def flat_map
|
68
55
|
yield value
|
69
56
|
end
|
70
|
-
alias_method :and_then, :flat_map
|
71
57
|
|
72
58
|
def flat_map_error
|
73
59
|
self
|
74
60
|
end
|
75
|
-
alias_method :or_else, :flat_map_error
|
76
61
|
end
|
77
62
|
|
78
|
-
class Failure
|
63
|
+
class Failure < Resonad
|
79
64
|
attr_accessor :error
|
80
65
|
|
81
66
|
def initialize(error)
|
@@ -87,10 +72,6 @@ module Resonad
|
|
87
72
|
false
|
88
73
|
end
|
89
74
|
|
90
|
-
def failure?
|
91
|
-
true
|
92
|
-
end
|
93
|
-
|
94
75
|
def on_success
|
95
76
|
self
|
96
77
|
end
|
@@ -120,12 +101,44 @@ module Resonad
|
|
120
101
|
def flat_map
|
121
102
|
self
|
122
103
|
end
|
123
|
-
alias_method :and_then, :flat_map
|
124
104
|
|
125
105
|
def flat_map_error
|
126
106
|
yield error
|
127
107
|
end
|
128
|
-
alias_method :or_else, :flat_map_error
|
129
108
|
end
|
130
109
|
|
110
|
+
def self.rescuing_from(*exception_classes)
|
111
|
+
Success(yield)
|
112
|
+
rescue Exception => e
|
113
|
+
if exception_classes.empty?
|
114
|
+
Failure(e) # rescue from all exceptions
|
115
|
+
elsif exception_classes.any? { |klass| e.is_a?(klass) }
|
116
|
+
Failure(e) # rescue from specified exception type
|
117
|
+
else
|
118
|
+
raise # reraise unhandled exception
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def initialize(*args)
|
123
|
+
raise NotImplementedError, "This is an abstract class. Use Resonad::Success or Resonad::Failure instead."
|
124
|
+
end
|
125
|
+
|
126
|
+
def success?
|
127
|
+
raise NotImplementedError, "should be implemented in subclass"
|
128
|
+
end
|
129
|
+
|
130
|
+
def failure?
|
131
|
+
not success?
|
132
|
+
end
|
133
|
+
|
134
|
+
def flat_map
|
135
|
+
raise NotImplementedError, "should be implemented in subclass"
|
136
|
+
end
|
137
|
+
alias_method :and_then, :flat_map
|
138
|
+
|
139
|
+
def flat_map_error
|
140
|
+
raise NotImplementedError, "should be implemented in subclass"
|
141
|
+
end
|
142
|
+
alias_method :or_else, :flat_map_error
|
143
|
+
|
131
144
|
end
|
data/lib/resonad/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = '1.0
|
1
|
+
class Resonad
|
2
|
+
VERSION = '1.1.0'
|
3
3
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resonad
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Dalling
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|