possibly 0.1.1 → 0.2.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/possibly.rb +96 -44
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88d90724eacd2027f146e147fe9b3b44d70e11d9
|
4
|
+
data.tar.gz: 69d10e194d938c8c27ec131a69296d7dca8d597a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8e95af1c6849dc749e809df67539585abacb495d74f3100a7ad08dd825dc4a645615bffa98c40f0ab7e3561368c268c84262e683bb44df9242ee23dd7c9202d
|
7
|
+
data.tar.gz: 638e0c13f133d4d1f03d655e2efa24da79a623fb798e0ea6cb0b2f5323bfc8768ff2b16a3377082399b0a9e9941e3f3af02c94e3aef11900c6540328e9ab494a
|
data/lib/possibly.rb
CHANGED
@@ -1,59 +1,111 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
(
|
4
|
-
|
5
|
-
|
6
|
-
if res.respond_to?(:each) then Maybe(res.first) else res end
|
7
|
-
}
|
1
|
+
class Maybe
|
2
|
+
([:each] + Enumerable.instance_methods).each do |enumerable_method|
|
3
|
+
define_method(enumerable_method) do |*args, &block|
|
4
|
+
res = __enumerable_value.send(enumerable_method, *args, &block)
|
5
|
+
res.respond_to?(:each) ? Maybe(res.first) : res
|
8
6
|
end
|
7
|
+
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def to_ary
|
10
|
+
__enumerable_value
|
11
|
+
end
|
12
|
+
alias_method :to_a, :to_ary
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
alias_method :eql?, :==
|
14
|
+
def ==(other)
|
15
|
+
other.class == self.class
|
19
16
|
end
|
17
|
+
alias_method :eql?, :==
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
def initialize(value) @value = value; end
|
27
|
-
def ==(o)
|
28
|
-
super && get == o.get
|
29
|
-
end
|
30
|
-
alias_method :eql?, :==
|
31
|
-
def method_missing(method_sym, *args, &block)
|
32
|
-
map { |value| value.send(method_sym, *args, &block) }
|
33
|
-
end
|
20
|
+
# Represents a non-empty value
|
21
|
+
class Some < Maybe
|
22
|
+
def initialize(value)
|
23
|
+
@value = value
|
24
|
+
end
|
34
25
|
|
35
|
-
|
36
|
-
|
26
|
+
def get
|
27
|
+
@value
|
37
28
|
end
|
38
29
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
30
|
+
def or_else(*)
|
31
|
+
@value
|
32
|
+
end
|
33
|
+
|
34
|
+
# rubocop:disable PredicateName
|
35
|
+
def is_some?
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def is_none?
|
40
|
+
false
|
41
|
+
end
|
42
|
+
# rubocop:enable PredicateName
|
43
|
+
|
44
|
+
def ==(other)
|
45
|
+
super && get == other.get
|
46
|
+
end
|
47
|
+
alias_method :eql?, :==
|
48
|
+
|
49
|
+
def ===(other)
|
50
|
+
other && other.class == self.class && @value === other.get
|
51
|
+
end
|
52
|
+
|
53
|
+
def method_missing(method_sym, *args, &block)
|
54
|
+
map { |value| value.send(method_sym, *args, &block) }
|
55
|
+
end
|
47
56
|
|
48
|
-
|
49
|
-
|
57
|
+
private
|
58
|
+
|
59
|
+
def __enumerable_value
|
60
|
+
[@value]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Represents an empty value
|
65
|
+
class None < Maybe
|
66
|
+
def get
|
67
|
+
fail 'No such element'
|
68
|
+
end
|
69
|
+
|
70
|
+
def or_else(els = nil)
|
71
|
+
block_given? ? yield : els
|
72
|
+
end
|
73
|
+
|
74
|
+
# rubocop:disable PredicateName
|
75
|
+
def is_some?
|
76
|
+
false
|
77
|
+
end
|
78
|
+
|
79
|
+
def is_none?
|
80
|
+
true
|
81
|
+
end
|
82
|
+
# rubocop:enable PredicateName
|
83
|
+
|
84
|
+
def method_missing(*)
|
85
|
+
self
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def __enumerable_value
|
91
|
+
[]
|
50
92
|
end
|
51
93
|
end
|
52
94
|
|
95
|
+
# rubocop:disable MethodName
|
53
96
|
def Maybe(value)
|
54
|
-
if value
|
55
|
-
|
97
|
+
if value.nil? || (value.respond_to?(:length) && value.length == 0)
|
98
|
+
None()
|
56
99
|
else
|
57
|
-
|
100
|
+
Some(value)
|
58
101
|
end
|
59
|
-
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def Some(value)
|
105
|
+
Some.new(value)
|
106
|
+
end
|
107
|
+
|
108
|
+
def None
|
109
|
+
None.new
|
110
|
+
end
|
111
|
+
# rubocop:enable MethodName
|