zx-monads 0.0.5 → 0.0.6
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/zx/maybe.rb +179 -14
- data/lib/zx/maybeable.rb +6 -0
- data/lib/zx/steps.rb +2 -2
- data/lib/zx/version.rb +1 -1
- data/lib/zx.rb +0 -4
- metadata +3 -3
- data/lib/maybe.rb +0 -173
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0391e47fa921d99cc0295cd52c3dd364a6f2bbe69af850b8cce890f7d74510ab'
|
4
|
+
data.tar.gz: b662943acb8c80009cc12d2322495169aca0bcda8bd52d7d1aa8ae5808f93998
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4eac7c508d2eeb24fb0cdcda5ef86fe55536773533acb22ff3e4865e0190379ddc723a00f6ed6ee2bae3183040e258cce8740e1f90931fd2064cf9a30ddb36d4
|
7
|
+
data.tar.gz: 47b496f06b771727f6b5d542dda7c303bb178b64253ef6dbbe9d978937671c28a78e433ca312ac488c67cbdf2385781bb5db5fb8016b48ce990d1a81bb9c64b7
|
data/lib/zx/maybe.rb
CHANGED
@@ -1,34 +1,199 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Zx
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
4
|
+
class Maybe
|
5
|
+
attr_reader :value
|
6
|
+
|
7
|
+
IsBlank = ->(value) { value.nil? || value.to_s.strip&.empty? || !value }
|
8
|
+
|
9
|
+
def self.of(...)
|
10
|
+
new.of(...)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.[](...)
|
14
|
+
of(...)
|
15
|
+
end
|
16
|
+
|
17
|
+
def of(value)
|
18
|
+
return None.new if IsBlank[value]
|
19
|
+
|
20
|
+
Some.new(value)
|
21
|
+
rescue StandardError
|
22
|
+
None.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def type
|
26
|
+
to_s.downcase.to_sym
|
27
|
+
end
|
28
|
+
|
29
|
+
def some?
|
30
|
+
type == :some
|
31
|
+
end
|
32
|
+
|
33
|
+
def none?
|
34
|
+
type == :none
|
35
|
+
end
|
36
|
+
|
37
|
+
def unwrap
|
38
|
+
@value
|
39
|
+
end
|
40
|
+
|
41
|
+
def or(value)
|
42
|
+
IsBlank[@value] ? value : @value
|
43
|
+
end
|
44
|
+
|
45
|
+
def >>(other)
|
46
|
+
self > other
|
47
|
+
end
|
48
|
+
alias | >>
|
49
|
+
|
50
|
+
def fmap(_)
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
def >(_other)
|
55
|
+
self
|
56
|
+
end
|
57
|
+
|
58
|
+
def map(arg = nil, &block)
|
59
|
+
return Maybe[block.call(@value)] if block_given?
|
60
|
+
return Maybe[arg.arity > 1 ? arg.curry.call(@value) : arg.call(@value)] if arg.respond_to?(:call)
|
61
|
+
|
62
|
+
case arg
|
63
|
+
in None then self
|
64
|
+
in Symbol | String then dig(arg)
|
65
|
+
end
|
66
|
+
rescue StandardError => e
|
67
|
+
None.new(e.message)
|
68
|
+
end
|
69
|
+
alias apply map
|
70
|
+
|
71
|
+
def map!(&block)
|
72
|
+
@value = block.call(@value)
|
73
|
+
|
74
|
+
Maybe[@value]
|
75
|
+
end
|
76
|
+
|
77
|
+
def apply!(...)
|
78
|
+
apply(...).unwrap
|
79
|
+
end
|
80
|
+
|
81
|
+
def dig(...)
|
82
|
+
Maybe[@value&.dig(...)]
|
83
|
+
end
|
84
|
+
|
85
|
+
def dig!(...)
|
86
|
+
dig(...).unwrap
|
87
|
+
end
|
88
|
+
|
89
|
+
def match(some:, none:)
|
90
|
+
case self
|
91
|
+
in Some then some.call(@value)
|
92
|
+
else none.call
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def on_success(&block)
|
97
|
+
return self if none?
|
98
|
+
|
99
|
+
block.call(Some[@value])
|
100
|
+
|
101
|
+
self
|
102
|
+
end
|
103
|
+
|
104
|
+
def on_failure(&block)
|
105
|
+
return self if some?
|
106
|
+
|
107
|
+
block.call(None[@value])
|
108
|
+
|
109
|
+
self
|
110
|
+
end
|
111
|
+
|
112
|
+
def on(ontype, &block)
|
113
|
+
case ontype.to_sym
|
114
|
+
when :success then on_success(&block)
|
115
|
+
when :failure then on_failure(&block)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class Some < Maybe
|
120
|
+
def self.[](...)
|
121
|
+
new(...)
|
122
|
+
end
|
123
|
+
|
124
|
+
def initialize(value = nil)
|
125
|
+
@value = value
|
126
|
+
end
|
127
|
+
|
128
|
+
def deconstruct
|
129
|
+
[@value]
|
130
|
+
end
|
131
|
+
|
132
|
+
def inspect
|
133
|
+
format("#<Zx::Maybe::#{self}:0x%x value=%s>", object_id, @value.inspect)
|
134
|
+
end
|
135
|
+
|
136
|
+
def to_s
|
137
|
+
'Some'
|
138
|
+
end
|
139
|
+
|
140
|
+
def >(other)
|
141
|
+
other.respond_to?(:call) ? other.call(@value) : other
|
142
|
+
end
|
143
|
+
|
144
|
+
def fmap(&block)
|
145
|
+
Maybe[block.call(@value)]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class None < Maybe
|
150
|
+
def self.[](...)
|
151
|
+
new(...)
|
152
|
+
end
|
153
|
+
|
154
|
+
def initialize(value = nil)
|
155
|
+
@value = value
|
156
|
+
end
|
157
|
+
|
158
|
+
def deconstruct
|
159
|
+
[nil]
|
160
|
+
end
|
161
|
+
|
162
|
+
def inspect
|
163
|
+
format("#<Zx::Maybe::#{self}:0x%x value=%s>", object_id, @value.inspect)
|
164
|
+
end
|
165
|
+
|
166
|
+
def to_s
|
167
|
+
'None'
|
168
|
+
end
|
169
|
+
|
170
|
+
def map
|
171
|
+
self
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
module ClassMethods
|
176
|
+
None = ->(*kwargs) { Zx::Maybe::None.new(*kwargs) }
|
177
|
+
Some = ->(*kwargs) { Zx::Maybe::Some.new(*kwargs) }
|
178
|
+
Maybe = ->(*kwargs) { Zx::Maybe.of(*kwargs) }
|
9
179
|
|
10
180
|
def Maybe(*kwargs)
|
11
|
-
::Maybe.of(*kwargs)
|
181
|
+
Zx::Maybe.of(*kwargs)
|
12
182
|
end
|
13
183
|
|
14
184
|
def Some(*kwargs)
|
15
|
-
::Maybe::Some.new(*kwargs)
|
185
|
+
Zx::Maybe::Some.new(*kwargs)
|
16
186
|
end
|
17
187
|
|
18
188
|
def None(*kwargs)
|
19
|
-
::Maybe::None.new(*kwargs)
|
189
|
+
Zx::Maybe::None.new(*kwargs)
|
20
190
|
end
|
21
191
|
|
22
192
|
def Try(default = nil, options = {})
|
23
|
-
Some
|
193
|
+
Some[yield]
|
24
194
|
rescue StandardError => e
|
25
195
|
None[default || options.fetch(:or, nil)]
|
26
196
|
end
|
27
197
|
end
|
28
|
-
|
29
|
-
def self.included(klass)
|
30
|
-
klass.include(Maybeable)
|
31
|
-
klass.extend(Maybeable)
|
32
|
-
end
|
33
198
|
end
|
34
199
|
end
|
data/lib/zx/maybeable.rb
ADDED
data/lib/zx/steps.rb
CHANGED
data/lib/zx/version.rb
CHANGED
data/lib/zx.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zx-monads
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thadeu Esteves
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,9 +85,9 @@ files:
|
|
85
85
|
- Rakefile
|
86
86
|
- bin/console
|
87
87
|
- bin/setup
|
88
|
-
- lib/maybe.rb
|
89
88
|
- lib/zx.rb
|
90
89
|
- lib/zx/maybe.rb
|
90
|
+
- lib/zx/maybeable.rb
|
91
91
|
- lib/zx/steps.rb
|
92
92
|
- lib/zx/version.rb
|
93
93
|
- zx-monads.gemspec
|
data/lib/maybe.rb
DELETED
@@ -1,173 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Maybe
|
4
|
-
attr_reader :value
|
5
|
-
|
6
|
-
IsBlank = ->(value) { value.nil? || value.to_s.strip&.empty? || !value }
|
7
|
-
|
8
|
-
def self.of(...)
|
9
|
-
new.of(...)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.[](...)
|
13
|
-
of(...)
|
14
|
-
end
|
15
|
-
|
16
|
-
def of(value)
|
17
|
-
return None.new if IsBlank[value]
|
18
|
-
|
19
|
-
Some.new(value)
|
20
|
-
rescue StandardError
|
21
|
-
None.new
|
22
|
-
end
|
23
|
-
|
24
|
-
def type
|
25
|
-
to_s.downcase.to_sym
|
26
|
-
end
|
27
|
-
|
28
|
-
def some?
|
29
|
-
type == :some
|
30
|
-
end
|
31
|
-
|
32
|
-
def none?
|
33
|
-
type == :none
|
34
|
-
end
|
35
|
-
|
36
|
-
def unwrap
|
37
|
-
@value
|
38
|
-
end
|
39
|
-
|
40
|
-
def or(value)
|
41
|
-
IsBlank[@value] ? value : @value
|
42
|
-
end
|
43
|
-
|
44
|
-
def >>(other)
|
45
|
-
self > other
|
46
|
-
end
|
47
|
-
alias | >>
|
48
|
-
|
49
|
-
def fmap(_)
|
50
|
-
self
|
51
|
-
end
|
52
|
-
|
53
|
-
def >(_other)
|
54
|
-
self
|
55
|
-
end
|
56
|
-
|
57
|
-
def map(arg = nil, &block)
|
58
|
-
return Maybe[block.call(@value)] if block_given?
|
59
|
-
return Maybe[arg.arity > 1 ? arg.curry.call(@value) : arg.call(@value)] if arg.respond_to?(:call)
|
60
|
-
|
61
|
-
case arg
|
62
|
-
in None then self
|
63
|
-
in Symbol | String then dig(arg)
|
64
|
-
end
|
65
|
-
rescue StandardError => e
|
66
|
-
None.new(e.message)
|
67
|
-
end
|
68
|
-
alias apply map
|
69
|
-
|
70
|
-
def map!(&block)
|
71
|
-
@value = block.call(@value)
|
72
|
-
|
73
|
-
Maybe[@value]
|
74
|
-
end
|
75
|
-
|
76
|
-
def apply!(...)
|
77
|
-
apply(...).unwrap
|
78
|
-
end
|
79
|
-
|
80
|
-
def dig(...)
|
81
|
-
Maybe[@value&.dig(...)]
|
82
|
-
end
|
83
|
-
|
84
|
-
def dig!(...)
|
85
|
-
dig(...).unwrap
|
86
|
-
end
|
87
|
-
|
88
|
-
def match(some:, none:)
|
89
|
-
case self
|
90
|
-
in Some then some.call(@value)
|
91
|
-
else none.call
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def on_success(&block)
|
96
|
-
return self if none?
|
97
|
-
|
98
|
-
block.call(Some[@value])
|
99
|
-
|
100
|
-
self
|
101
|
-
end
|
102
|
-
|
103
|
-
def on_failure(&block)
|
104
|
-
return self if some?
|
105
|
-
|
106
|
-
block.call(None[@value])
|
107
|
-
|
108
|
-
self
|
109
|
-
end
|
110
|
-
|
111
|
-
def on(ontype, &block)
|
112
|
-
case ontype.to_sym
|
113
|
-
when :success then on_success(&block)
|
114
|
-
when :failure then on_failure(&block)
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
class Some < Maybe
|
119
|
-
def self.[](...)
|
120
|
-
new(...)
|
121
|
-
end
|
122
|
-
|
123
|
-
def initialize(value = nil)
|
124
|
-
@value = value
|
125
|
-
end
|
126
|
-
|
127
|
-
def deconstruct
|
128
|
-
[@value]
|
129
|
-
end
|
130
|
-
|
131
|
-
def inspect
|
132
|
-
format("#<Zx::Maybe::#{self}:0x%x value=%s>", object_id, @value.inspect)
|
133
|
-
end
|
134
|
-
|
135
|
-
def to_s
|
136
|
-
'Some'
|
137
|
-
end
|
138
|
-
|
139
|
-
def >(other)
|
140
|
-
other.respond_to?(:call) ? other.call(@value) : other
|
141
|
-
end
|
142
|
-
|
143
|
-
def fmap(&block)
|
144
|
-
Maybe[block.call(@value)]
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
class None < Maybe
|
149
|
-
def self.[](...)
|
150
|
-
new(...)
|
151
|
-
end
|
152
|
-
|
153
|
-
def initialize(value = nil)
|
154
|
-
@value = value
|
155
|
-
end
|
156
|
-
|
157
|
-
def deconstruct
|
158
|
-
[nil]
|
159
|
-
end
|
160
|
-
|
161
|
-
def inspect
|
162
|
-
format("#<Zx::Maybe::#{self}:0x%x value=%s>", object_id, @value.inspect)
|
163
|
-
end
|
164
|
-
|
165
|
-
def to_s
|
166
|
-
'None'
|
167
|
-
end
|
168
|
-
|
169
|
-
def map
|
170
|
-
self
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|