zx-monads 0.0.5 → 0.0.7
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/README.md +29 -29
- data/lib/zx/maybe.rb +183 -15
- 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: 6fad11ef006f65fc1217e5bbf480844d4367b3d7d8f72f486af7c8b3601de4cb
|
4
|
+
data.tar.gz: fca3ee13b064db8da1a706ad749e8af4a3f9ceddfd19876be49eaec28dcadc93
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ccf1a54176be479cb0e09ad8c2bab177668e8d9219bbc4dbe113ee855231d11cb79c3dbc5ece68b9a2d7ab2208b17cb005eb3eb4beff1ef8ee9b21faae9ff6f
|
7
|
+
data.tar.gz: 27430e4a6472dabc923357276cd3c39ca55814ddec4c7f0b6c012f60fedd3bc61080ce9d82428ed095992c96b8087d987a403d30a2fe3abc8cad7c25484c7a29
|
data/README.md
CHANGED
@@ -68,11 +68,11 @@ class Order
|
|
68
68
|
end
|
69
69
|
|
70
70
|
class Order
|
71
|
-
include Zx::
|
71
|
+
include Zx::Maybeable
|
72
72
|
end
|
73
73
|
|
74
74
|
class ProcessOrder < Zx::Steps
|
75
|
-
#
|
75
|
+
# include Zx::Maybeable included now!
|
76
76
|
end
|
77
77
|
```
|
78
78
|
|
@@ -102,35 +102,35 @@ end
|
|
102
102
|
### ZX::Maybe
|
103
103
|
|
104
104
|
```ruby
|
105
|
-
result = Maybe[1] # or Maybe.of(1)
|
105
|
+
result = Zx::Maybe[1] # or Maybe.of(1)
|
106
106
|
```
|
107
107
|
|
108
108
|
```ruby
|
109
|
-
result = Maybe[nil] # or Maybe.of(nil)
|
109
|
+
result = Zx::Maybe[nil] # or Maybe.of(nil)
|
110
110
|
```
|
111
111
|
|
112
112
|
```ruby
|
113
|
-
result = Maybe[1].map{ _1 + 2}
|
113
|
+
result = Zx::Maybe[1].map{ _1 + 2}
|
114
114
|
# -> Some(3)
|
115
115
|
```
|
116
116
|
|
117
117
|
```ruby
|
118
|
-
result = Maybe[nil].map{ _1 + 2}
|
118
|
+
result = Zx::Maybe[nil].map{ _1 + 2}
|
119
119
|
# -> None
|
120
120
|
```
|
121
121
|
|
122
122
|
```ruby
|
123
|
-
result = Maybe.of(1).or(2)
|
123
|
+
result = Zx::Maybe.of(1).or(2)
|
124
124
|
result.or(2) # 1
|
125
125
|
```
|
126
126
|
|
127
127
|
```ruby
|
128
|
-
result = Maybe.of(' ').or(2)
|
128
|
+
result = Zx::Maybe.of(' ').or(2)
|
129
129
|
result.or(2) # 2
|
130
130
|
```
|
131
131
|
|
132
132
|
```ruby
|
133
|
-
result = Maybe.of(' ').or(2)
|
133
|
+
result = Zx::Maybe.of(' ').or(2)
|
134
134
|
result.or(2) # 2
|
135
135
|
```
|
136
136
|
|
@@ -143,7 +143,7 @@ order = {
|
|
143
143
|
}
|
144
144
|
}
|
145
145
|
|
146
|
-
price = Maybe[order]
|
146
|
+
price = Zx::Maybe[order]
|
147
147
|
.map { _1[:shopping] }
|
148
148
|
.map { _1[:banana] }
|
149
149
|
.map { _1[:price] }
|
@@ -152,13 +152,13 @@ price = Maybe[order]
|
|
152
152
|
|
153
153
|
# or using #dig
|
154
154
|
|
155
|
-
price = Maybe[order].dig(:shopping, :banana, :price)
|
155
|
+
price = Zx::Maybe[order].dig(:shopping, :banana, :price)
|
156
156
|
# -> Some(10.0)
|
157
157
|
|
158
|
-
price_none = Maybe[order].dig(:shopping, :banana, :price_non_exists)
|
158
|
+
price_none = Zx::Maybe[order].dig(:shopping, :banana, :price_non_exists)
|
159
159
|
# -> None
|
160
160
|
|
161
|
-
price_or = Maybe[order].dig(:shopping, :banana, :price_non_exists).or(10.0)
|
161
|
+
price_or = Zx::Maybe[order].dig(:shopping, :banana, :price_non_exists).or(10.0)
|
162
162
|
# -> Some(10.0)
|
163
163
|
```
|
164
164
|
|
@@ -167,11 +167,11 @@ class Response
|
|
167
167
|
attr_reader :body
|
168
168
|
|
169
169
|
def initialize(new_body)
|
170
|
-
@body = Maybe[new_body]
|
170
|
+
@body = Zx::Maybe[new_body]
|
171
171
|
end
|
172
172
|
|
173
173
|
def change(new_body)
|
174
|
-
@body = Maybe[new_body]
|
174
|
+
@body = Zx::Maybe[new_body]
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
@@ -182,7 +182,7 @@ response.change({ status: 200 })
|
|
182
182
|
expect(response.body).to be_some
|
183
183
|
|
184
184
|
response_status = response.body.match(
|
185
|
-
some: ->(body) { Maybe[body].map { _1.fetch(:status) }.unwrap },
|
185
|
+
some: ->(body) { Zx::Maybe[body].map { _1.fetch(:status) }.unwrap },
|
186
186
|
none: -> {}
|
187
187
|
)
|
188
188
|
```
|
@@ -196,7 +196,7 @@ response = Response.new(dump) # It's receive an JSON stringified
|
|
196
196
|
|
197
197
|
module StatusCodeUnwrapModule
|
198
198
|
def self.call(body)
|
199
|
-
Maybe[body]
|
199
|
+
Zx::Maybe[body]
|
200
200
|
.map{ JSON(_1, symbolize_names: true) }
|
201
201
|
.dig(:status, :code)
|
202
202
|
.apply(&:to_i)
|
@@ -215,11 +215,11 @@ expect(response_status).to eq(300)
|
|
215
215
|
You can use `>>` to compose many callables, like this.
|
216
216
|
|
217
217
|
```rb
|
218
|
-
sum = ->(x) { Maybe::Some[x + 1] }
|
218
|
+
sum = ->(x) { Zx::Maybe::Some[x + 1] }
|
219
219
|
|
220
|
-
subtract = ->(x) { Maybe::Some[x - 1] }
|
220
|
+
subtract = ->(x) { Zx::Maybe::Some[x - 1] }
|
221
221
|
|
222
|
-
result = Maybe[1] >> \
|
222
|
+
result = Zx::Maybe[1] >> \
|
223
223
|
sum >> \
|
224
224
|
subtract
|
225
225
|
|
@@ -229,11 +229,11 @@ expect(result.unwrap).to eq(1)
|
|
229
229
|
If handle None, no worries.
|
230
230
|
|
231
231
|
```rb
|
232
|
-
sum = ->(x) { Maybe::Some[x + 1] }
|
232
|
+
sum = ->(x) { Zx::Maybe::Some[x + 1] }
|
233
233
|
|
234
|
-
subtract = ->(_) { Maybe::None.new }
|
234
|
+
subtract = ->(_) { Zx::Maybe::None.new }
|
235
235
|
|
236
|
-
result = Maybe[1] \
|
236
|
+
result = Zx::Maybe[1] \
|
237
237
|
>> sum \
|
238
238
|
>> subtract
|
239
239
|
|
@@ -243,7 +243,7 @@ expect(result.unwrap).to be_nil
|
|
243
243
|
```rb
|
244
244
|
class Order
|
245
245
|
def self.sum(x)
|
246
|
-
Maybe[{ number: x + 1 }]
|
246
|
+
Zx::Maybe[{ number: x + 1 }]
|
247
247
|
end
|
248
248
|
end
|
249
249
|
|
@@ -258,7 +258,7 @@ expect(result.unwrap).to be(2)
|
|
258
258
|
|
259
259
|
```rb
|
260
260
|
class Order
|
261
|
-
include Zx::
|
261
|
+
include Zx::Maybeable
|
262
262
|
|
263
263
|
def self.sum(x)
|
264
264
|
new.sum(x)
|
@@ -280,7 +280,7 @@ expect(result.unwrap).to be(2)
|
|
280
280
|
|
281
281
|
```rb
|
282
282
|
class Order
|
283
|
-
include Zx::
|
283
|
+
include Zx::Maybeable
|
284
284
|
|
285
285
|
def self.sum(x)
|
286
286
|
new.sum(x)
|
@@ -305,7 +305,7 @@ expect(number.unwrap).to be(0) # nil.to_i == 0
|
|
305
305
|
|
306
306
|
```rb
|
307
307
|
class Order
|
308
|
-
include Zx::
|
308
|
+
include Zx::Maybeable
|
309
309
|
|
310
310
|
def self.sum(x)
|
311
311
|
new.sum(x)
|
@@ -327,7 +327,7 @@ With default value, in None case.
|
|
327
327
|
|
328
328
|
```rb
|
329
329
|
class Order
|
330
|
-
include Zx::
|
330
|
+
include Zx::Maybeable
|
331
331
|
|
332
332
|
def self.sum(x)
|
333
333
|
new.sum(x)
|
@@ -347,7 +347,7 @@ expect(result.unwrap).to be(2)
|
|
347
347
|
|
348
348
|
```rb
|
349
349
|
class Order
|
350
|
-
include Zx::
|
350
|
+
include Zx::Maybeable
|
351
351
|
|
352
352
|
def self.sum(x)
|
353
353
|
new.sum(x)
|
data/lib/zx/maybe.rb
CHANGED
@@ -1,34 +1,202 @@
|
|
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 = ->(value = nil) { Zx::Maybe::None.new(value) }
|
177
|
+
Some = ->(*kwargs) { Zx::Maybe::Some.new(*kwargs) }
|
178
|
+
Maybe = ->(*kwargs) { Zx::Maybe.of(*kwargs) }
|
9
179
|
|
10
180
|
def Maybe(*kwargs)
|
11
|
-
|
181
|
+
Maybe[*kwargs]
|
12
182
|
end
|
13
183
|
|
14
184
|
def Some(*kwargs)
|
15
|
-
|
185
|
+
Some[*kwargs]
|
16
186
|
end
|
17
187
|
|
18
|
-
def None(
|
19
|
-
::Maybe
|
188
|
+
def None(value = nil)
|
189
|
+
Zx::Maybe.of(value)
|
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
|
199
|
+
|
200
|
+
include Maybe::ClassMethods
|
201
|
+
extend Maybe::ClassMethods
|
34
202
|
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.7
|
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
|