fear 1.0.0 → 2.0.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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +27 -0
  3. data/.github/workflows/rubocop.yml +39 -0
  4. data/.github/workflows/spec.yml +42 -0
  5. data/.rubocop.yml +4 -60
  6. data/.simplecov +17 -0
  7. data/CHANGELOG.md +29 -1
  8. data/Gemfile +5 -5
  9. data/Gemfile.lock +86 -50
  10. data/README.md +240 -209
  11. data/Rakefile +72 -65
  12. data/examples/pattern_extracting.rb +10 -8
  13. data/examples/pattern_matching_binary_tree_set.rb +7 -2
  14. data/examples/pattern_matching_number_in_words.rb +48 -42
  15. data/fear.gemspec +33 -34
  16. data/lib/dry/types/fear/option.rb +125 -0
  17. data/lib/dry/types/fear.rb +8 -0
  18. data/lib/fear/await.rb +33 -0
  19. data/lib/fear/awaitable.rb +28 -0
  20. data/lib/fear/either.rb +15 -4
  21. data/lib/fear/either_api.rb +4 -0
  22. data/lib/fear/either_pattern_match.rb +9 -5
  23. data/lib/fear/empty_partial_function.rb +3 -1
  24. data/lib/fear/failure.rb +7 -7
  25. data/lib/fear/failure_pattern_match.rb +4 -0
  26. data/lib/fear/for.rb +4 -2
  27. data/lib/fear/for_api.rb +5 -1
  28. data/lib/fear/future.rb +157 -82
  29. data/lib/fear/future_api.rb +17 -4
  30. data/lib/fear/left.rb +3 -9
  31. data/lib/fear/left_pattern_match.rb +2 -0
  32. data/lib/fear/none.rb +28 -10
  33. data/lib/fear/none_pattern_match.rb +2 -0
  34. data/lib/fear/option.rb +30 -2
  35. data/lib/fear/option_api.rb +4 -0
  36. data/lib/fear/option_pattern_match.rb +8 -3
  37. data/lib/fear/partial_function/and_then.rb +4 -2
  38. data/lib/fear/partial_function/any.rb +2 -0
  39. data/lib/fear/partial_function/combined.rb +3 -1
  40. data/lib/fear/partial_function/empty.rb +6 -0
  41. data/lib/fear/partial_function/guard/and.rb +2 -0
  42. data/lib/fear/partial_function/guard/and3.rb +2 -0
  43. data/lib/fear/partial_function/guard/or.rb +2 -0
  44. data/lib/fear/partial_function/guard.rb +8 -6
  45. data/lib/fear/partial_function/lifted.rb +2 -0
  46. data/lib/fear/partial_function/or_else.rb +5 -1
  47. data/lib/fear/partial_function.rb +18 -9
  48. data/lib/fear/partial_function_class.rb +3 -1
  49. data/lib/fear/pattern_match.rb +3 -11
  50. data/lib/fear/pattern_matching_api.rb +6 -28
  51. data/lib/fear/promise.rb +7 -5
  52. data/lib/fear/right.rb +3 -9
  53. data/lib/fear/right_biased.rb +5 -3
  54. data/lib/fear/right_pattern_match.rb +4 -0
  55. data/lib/fear/some.rb +35 -8
  56. data/lib/fear/some_pattern_match.rb +2 -0
  57. data/lib/fear/struct.rb +237 -0
  58. data/lib/fear/success.rb +7 -8
  59. data/lib/fear/success_pattern_match.rb +4 -0
  60. data/lib/fear/try.rb +8 -2
  61. data/lib/fear/try_api.rb +4 -0
  62. data/lib/fear/try_pattern_match.rb +9 -5
  63. data/lib/fear/unit.rb +6 -2
  64. data/lib/fear/utils.rb +14 -2
  65. data/lib/fear/version.rb +4 -1
  66. data/lib/fear.rb +26 -44
  67. data/spec/dry/types/fear/option/constrained_spec.rb +22 -0
  68. data/spec/dry/types/fear/option/core_spec.rb +77 -0
  69. data/spec/dry/types/fear/option/default_spec.rb +21 -0
  70. data/spec/dry/types/fear/option/hash_spec.rb +58 -0
  71. data/spec/dry/types/fear/option/option_spec.rb +97 -0
  72. data/spec/fear/awaitable_spec.rb +19 -0
  73. data/spec/fear/done_spec.rb +7 -5
  74. data/spec/fear/either/mixin_spec.rb +4 -2
  75. data/spec/fear/either_pattern_match_spec.rb +10 -8
  76. data/spec/fear/either_pattern_matching_spec.rb +28 -0
  77. data/spec/fear/either_spec.rb +26 -0
  78. data/spec/fear/failure_spec.rb +57 -70
  79. data/spec/fear/for/mixin_spec.rb +15 -0
  80. data/spec/fear/for_spec.rb +19 -17
  81. data/spec/fear/future_spec.rb +477 -237
  82. data/spec/fear/guard_spec.rb +136 -24
  83. data/spec/fear/left_spec.rb +57 -70
  84. data/spec/fear/none_spec.rb +39 -43
  85. data/spec/fear/option/mixin_spec.rb +9 -7
  86. data/spec/fear/option_pattern_match_spec.rb +10 -8
  87. data/spec/fear/option_pattern_matching_spec.rb +34 -0
  88. data/spec/fear/option_spec.rb +142 -0
  89. data/spec/fear/partial_function/any_spec.rb +25 -0
  90. data/spec/fear/partial_function/empty_spec.rb +12 -10
  91. data/spec/fear/partial_function_and_then_spec.rb +39 -37
  92. data/spec/fear/partial_function_composition_spec.rb +46 -44
  93. data/spec/fear/partial_function_or_else_spec.rb +92 -90
  94. data/spec/fear/partial_function_spec.rb +91 -61
  95. data/spec/fear/pattern_match_spec.rb +19 -51
  96. data/spec/fear/pattern_matching_api_spec.rb +31 -0
  97. data/spec/fear/promise_spec.rb +23 -23
  98. data/spec/fear/right_biased/left.rb +28 -26
  99. data/spec/fear/right_biased/right.rb +51 -49
  100. data/spec/fear/right_spec.rb +48 -68
  101. data/spec/fear/some_spec.rb +30 -40
  102. data/spec/fear/success_spec.rb +40 -60
  103. data/spec/fear/try/mixin_spec.rb +19 -3
  104. data/spec/fear/try_api_spec.rb +23 -0
  105. data/spec/fear/try_pattern_match_spec.rb +10 -8
  106. data/spec/fear/try_pattern_matching_spec.rb +34 -0
  107. data/spec/fear/utils_spec.rb +16 -14
  108. data/spec/spec_helper.rb +13 -7
  109. data/spec/struct_pattern_matching_spec.rb +36 -0
  110. data/spec/struct_spec.rb +194 -0
  111. data/spec/support/dry_types.rb +6 -0
  112. metadata +128 -87
  113. data/.travis.yml +0 -13
  114. data/lib/fear/extractor/anonymous_array_splat_matcher.rb +0 -8
  115. data/lib/fear/extractor/any_matcher.rb +0 -15
  116. data/lib/fear/extractor/array_head_matcher.rb +0 -34
  117. data/lib/fear/extractor/array_matcher.rb +0 -38
  118. data/lib/fear/extractor/array_splat_matcher.rb +0 -14
  119. data/lib/fear/extractor/empty_list_matcher.rb +0 -18
  120. data/lib/fear/extractor/extractor_matcher.rb +0 -42
  121. data/lib/fear/extractor/grammar.rb +0 -201
  122. data/lib/fear/extractor/grammar.treetop +0 -129
  123. data/lib/fear/extractor/identifier_matcher.rb +0 -16
  124. data/lib/fear/extractor/matcher/and.rb +0 -36
  125. data/lib/fear/extractor/matcher.rb +0 -54
  126. data/lib/fear/extractor/named_array_splat_matcher.rb +0 -15
  127. data/lib/fear/extractor/pattern.rb +0 -55
  128. data/lib/fear/extractor/typed_identifier_matcher.rb +0 -24
  129. data/lib/fear/extractor/value_matcher.rb +0 -17
  130. data/lib/fear/extractor.rb +0 -108
  131. data/lib/fear/extractor_api.rb +0 -33
  132. data/spec/fear/extractor/array_matcher_spec.rb +0 -228
  133. data/spec/fear/extractor/extractor_matcher_spec.rb +0 -151
  134. data/spec/fear/extractor/grammar_array_spec.rb +0 -23
  135. data/spec/fear/extractor/identified_matcher_spec.rb +0 -47
  136. data/spec/fear/extractor/identifier_matcher_spec.rb +0 -66
  137. data/spec/fear/extractor/pattern_spec.rb +0 -32
  138. data/spec/fear/extractor/typed_identifier_matcher_spec.rb +0 -62
  139. data/spec/fear/extractor/value_matcher_number_spec.rb +0 -77
  140. data/spec/fear/extractor/value_matcher_string_spec.rb +0 -86
  141. data/spec/fear/extractor/value_matcher_symbol_spec.rb +0 -69
  142. data/spec/fear/extractor_api_spec.rb +0 -113
  143. data/spec/fear/extractor_spec.rb +0 -59
@@ -1,101 +1,213 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::PartialFunction::Guard do
2
- context 'Class' do
3
- context 'match' do
4
+ context "Class" do
5
+ context "match" do
4
6
  subject { Fear::PartialFunction::Guard.new(Integer) === 4 }
5
7
 
6
8
  it { is_expected.to eq(true) }
7
9
  end
8
10
 
9
- context 'not match' do
10
- subject { Fear::PartialFunction::Guard.new(Integer) === '4' }
11
+ context "not match" do
12
+ subject { Fear::PartialFunction::Guard.new(Integer) === "4" }
11
13
 
12
14
  it { is_expected.to eq(false) }
13
15
  end
14
16
  end
15
17
 
16
- context 'Symbol' do
17
- context 'match' do
18
+ context "Symbol" do
19
+ context "match" do
18
20
  subject { Fear::PartialFunction::Guard.new(:even?) === :even? }
19
21
 
20
22
  it { is_expected.to eq(true) }
21
23
  end
22
24
 
23
- context 'not match' do
25
+ context "not match" do
24
26
  subject { Fear::PartialFunction::Guard.new(:even?) === 4 }
25
27
 
26
28
  it { is_expected.to eq(false) }
27
29
  end
28
30
  end
29
31
 
30
- context 'Proc' do
31
- context 'match' do
32
+ context "Proc" do
33
+ context "match" do
32
34
  subject { Fear::PartialFunction::Guard.new(->(x) { x.even? }) === 4 }
33
35
 
34
36
  it { is_expected.to eq(true) }
35
37
  end
36
38
 
37
- context 'not match' do
39
+ context "not match" do
38
40
  subject { Fear::PartialFunction::Guard.new(->(x) { x.even? }) === 3 }
39
41
 
40
42
  it { is_expected.to eq(false) }
41
43
  end
42
44
  end
43
45
 
44
- describe '.and' do
45
- context 'match' do
46
+ describe ".and" do
47
+ context "match" do
46
48
  subject { guard === 4 }
47
49
  let(:guard) { Fear::PartialFunction::Guard.and([Integer, :even?.to_proc, ->(x) { x.even? }]) }
48
50
 
49
51
  it { is_expected.to eq(true) }
50
52
  end
51
53
 
52
- context 'not match' do
54
+ context "not match" do
53
55
  subject { guard === 3 }
54
56
  let(:guard) { Fear::PartialFunction::Guard.and([Integer, :even?.to_proc, ->(x) { x.even? }]) }
55
57
 
56
58
  it { is_expected.to eq(false) }
57
59
  end
58
60
 
59
- context 'empty array' do
61
+ context "empty array" do
60
62
  subject { guard === 4 }
61
63
  let(:guard) { Fear::PartialFunction::Guard.and([]) }
62
64
 
63
- it 'matches any values' do
65
+ it "matches any values" do
64
66
  is_expected.to eq(true)
65
67
  end
66
68
  end
67
69
 
68
- context 'short circuit' do
70
+ context "short circuit" do
69
71
  let(:guard) { Fear::PartialFunction::Guard.and([first, second, third]) }
70
72
  let(:first) { ->(_) { false } }
71
73
  let(:second) { ->(_) { raise } }
72
74
  let(:third) { ->(_) { raise } }
73
75
 
74
- it 'does not call the second and the third' do
76
+ it "does not call the second and the third" do
75
77
  expect { guard === 4 }.not_to raise_error
76
78
  end
77
79
  end
80
+
81
+ context "with many arguments" do
82
+ let(:guard) { Fear::PartialFunction::Guard.and([guard_1, guard_2, guard_3, guard_4]) }
83
+
84
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
85
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
86
+ let(:guard_3) { ->(x) { x % 6 == 0 } }
87
+ let(:guard_4) { ->(x) { x % 7 == 0 } }
88
+ let(:guard_4) { ->(x) { x % 8 == 0 } }
89
+
90
+ it { expect(guard === 3360).to eq(true) }
91
+ it { expect(guard === 10).to eq(false) }
92
+ it { expect(guard === 8).to eq(false) }
93
+ it { expect(guard === 5).to eq(false) }
94
+ it { expect(guard === 7).to eq(false) }
95
+ it { expect(guard === 6).to eq(false) }
96
+ it { expect(guard === 2).to eq(false) }
97
+ end
98
+
99
+ describe "#and" do
100
+ let(:guard) { guard_1_and_guard_2.and(guard_3) }
101
+ let(:guard_1_and_guard_2) { Fear::PartialFunction::Guard.and([guard_1, guard_2]) }
102
+
103
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
104
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
105
+ let(:guard_3) { ->(x) { x % 6 == 0 } }
106
+
107
+ it { expect(guard === 30).to eq(true) }
108
+ it { expect(guard === 10).to eq(false) }
109
+ it { expect(guard === 5).to eq(false) }
110
+ it { expect(guard === 2).to eq(false) }
111
+ it { expect(guard === 3).to eq(false) }
112
+ end
113
+
114
+ describe "#and", "with three arguments" do
115
+ let(:guard) { guard_123.and(guard_4) }
116
+ let(:guard_123) { Fear::PartialFunction::Guard.and([guard_1, guard_2, guard_3]) }
117
+
118
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
119
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
120
+ let(:guard_3) { ->(x) { x % 6 == 0 } }
121
+ let(:guard_4) { ->(x) { x % 7 == 0 } }
122
+
123
+ it { expect(guard === 420).to eq(true) }
124
+ it { expect(guard === 10).to eq(false) }
125
+ it { expect(guard === 5).to eq(false) }
126
+ it { expect(guard === 7).to eq(false) }
127
+ it { expect(guard === 6).to eq(false) }
128
+ it { expect(guard === 2).to eq(false) }
129
+ end
130
+
131
+ describe "#or" do
132
+ let(:guard) { guard_1_and_guard_2.or(guard_3) }
133
+ let(:guard_1_and_guard_2) { Fear::PartialFunction::Guard.and([guard_1, guard_2]) }
134
+
135
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
136
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
137
+ let(:guard_3) { ->(x) { x % 3 == 0 } }
138
+
139
+ it { expect(guard === 10).to eq(true) }
140
+ it { expect(guard === 3).to eq(true) }
141
+ it { expect(guard === 5).to eq(false) }
142
+ it { expect(guard === 2).to eq(false) }
143
+ it { expect(guard === 7).to eq(false) }
144
+ end
145
+
146
+ describe "#or", "with three arguments" do
147
+ let(:guard) { guard_123.or(guard_4) }
148
+ let(:guard_123) { Fear::PartialFunction::Guard.and([guard_1, guard_2, guard_3]) }
149
+
150
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
151
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
152
+ let(:guard_3) { ->(x) { x % 6 == 0 } }
153
+ let(:guard_4) { ->(x) { x % 7 == 0 } }
154
+
155
+ it { expect(guard === 30).to eq(true) }
156
+ it { expect(guard === 7).to eq(true) }
157
+ it { expect(guard === 5).to eq(false) }
158
+ it { expect(guard === 2).to eq(false) }
159
+ it { expect(guard === 6).to eq(false) }
160
+ end
78
161
  end
79
162
 
80
- describe '.or' do
81
- let(:guard) { Fear::PartialFunction::Guard.or(['F', Integer]) }
163
+ describe ".or" do
164
+ let(:guard) { Fear::PartialFunction::Guard.or(["F", Integer]) }
82
165
 
83
- context 'match second' do
166
+ context "match second" do
84
167
  subject { guard === 4 }
85
168
 
86
169
  it { is_expected.to eq(true) }
87
170
  end
88
171
 
89
- context 'match first' do
90
- subject { guard === 'F' }
172
+ context "match first" do
173
+ subject { guard === "F" }
91
174
 
92
175
  it { is_expected.to eq(true) }
93
176
  end
94
177
 
95
- context 'not match' do
96
- subject { guard === 'A&' }
178
+ context "not match" do
179
+ subject { guard === "A&" }
97
180
 
98
181
  it { is_expected.to eq(false) }
99
182
  end
183
+
184
+ describe "#and" do
185
+ let(:guard) { guard_1_or_guard_2.and(guard_3) }
186
+ let(:guard_1_or_guard_2) { Fear::PartialFunction::Guard.or([guard_1, guard_2]) }
187
+
188
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
189
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
190
+ let(:guard_3) { ->(x) { x % 3 == 0 } }
191
+
192
+ it { expect(guard === 6).to eq(true) }
193
+ it { expect(guard === 15).to eq(true) }
194
+ it { expect(guard === 5).to eq(false) }
195
+ it { expect(guard === 2).to eq(false) }
196
+ it { expect(guard === 3).to eq(false) }
197
+ end
198
+
199
+ describe "#or" do
200
+ let(:guard) { guard_1_or_guard_2.or(guard_3) }
201
+ let(:guard_1_or_guard_2) { Fear::PartialFunction::Guard.or([guard_1, guard_2]) }
202
+
203
+ let(:guard_1) { ->(x) { x % 5 == 0 } }
204
+ let(:guard_2) { ->(x) { x % 2 == 0 } }
205
+ let(:guard_3) { ->(x) { x % 3 == 0 } }
206
+
207
+ it { expect(guard === 5).to eq(true) }
208
+ it { expect(guard === 2).to eq(true) }
209
+ it { expect(guard === 3).to eq(true) }
210
+ it { expect(guard === 7).to eq(false) }
211
+ end
100
212
  end
101
213
  end
@@ -1,77 +1,79 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::Left do
2
4
  it_behaves_like Fear::RightBiased::Left do
3
- let(:left) { Fear.left('value') }
5
+ let(:left) { Fear.left("value") }
4
6
  end
5
7
 
6
- let(:left) { Fear.left('value') }
8
+ let(:left) { Fear.left("value") }
7
9
 
8
- describe '#right?' do
10
+ describe "#right?" do
9
11
  subject { left }
10
12
  it { is_expected.not_to be_right }
11
13
  end
12
14
 
13
- describe '#left?' do
15
+ describe "#left?" do
14
16
  subject { left }
15
17
  it { is_expected.to be_left }
16
18
  end
17
19
 
18
- describe '#select_or_else' do
20
+ describe "#select_or_else" do
19
21
  subject do
20
- left.select_or_else(default) { |v| v == 'value' }
22
+ left.select_or_else(default) { |v| v == "value" }
21
23
  end
22
24
 
23
- context 'proc default' do
25
+ context "proc default" do
24
26
  let(:default) { -> { -1 } }
25
27
 
26
- it 'returns itself' do
28
+ it "returns itself" do
27
29
  is_expected.to eq(left)
28
30
  end
29
31
  end
30
32
 
31
- context 'default' do
33
+ context "default" do
32
34
  let(:default) { -1 }
33
35
 
34
- it 'returns itself' do
36
+ it "returns itself" do
35
37
  is_expected.to eq(left)
36
38
  end
37
39
  end
38
40
  end
39
41
 
40
- describe '#or_else' do
42
+ describe "#or_else" do
41
43
  subject { left.or_else { alternative } }
42
44
  let(:alternative) { Fear.left(42) }
43
45
 
44
- it 'returns alternative' do
46
+ it "returns alternative" do
45
47
  is_expected.to eq(alternative)
46
48
  end
47
49
  end
48
50
 
49
- describe '#select' do
51
+ describe "#select" do
50
52
  subject do
51
- left.select { |v| v == 'value' }
53
+ left.select { |v| v == "value" }
52
54
  end
53
55
 
54
- it 'return self' do
56
+ it "return self" do
55
57
  is_expected.to eq(left)
56
58
  end
57
59
  end
58
60
 
59
- describe '#reject' do
61
+ describe "#reject" do
60
62
  subject do
61
- left.reject { |v| v == 'value' }
63
+ left.reject { |v| v == "value" }
62
64
  end
63
65
 
64
- it 'return self' do
66
+ it "return self" do
65
67
  is_expected.to eq(left)
66
68
  end
67
69
  end
68
70
 
69
- describe '#swap' do
71
+ describe "#swap" do
70
72
  subject { left.swap }
71
- it { is_expected.to eq(Fear.right('value')) }
73
+ it { is_expected.to eq(Fear.right("value")) }
72
74
  end
73
75
 
74
- describe '#reduce' do
76
+ describe "#reduce" do
75
77
  subject do
76
78
  left.reduce(
77
79
  ->(left) { "Left: #{left}" },
@@ -79,69 +81,76 @@ RSpec.describe Fear::Left do
79
81
  )
80
82
  end
81
83
 
82
- it { is_expected.to eq('Left: value') }
84
+ it { is_expected.to eq("Left: value") }
83
85
  end
84
86
 
85
- describe '#join_right' do
87
+ describe "#join_right" do
86
88
  subject(:join_right) { either.join_right }
87
89
 
88
- context 'value is Either' do
89
- let(:either) { described_class.new(Fear.left('error')) }
90
+ context "value is Either" do
91
+ let(:either) { described_class.new(Fear.left("error")) }
90
92
  it { is_expected.to eq(either) }
91
93
  end
92
94
 
93
- context 'value s not Either' do
94
- let(:either) { Fear.left('error') }
95
+ context "value s not Either" do
96
+ let(:either) { Fear.left("error") }
95
97
  it { is_expected.to eq(either) }
96
98
  end
97
99
  end
98
100
 
99
- describe '#join_left' do
100
- context 'value is Either' do
101
+ describe "#join_left" do
102
+ context "value is Either" do
101
103
  subject { either.join_left }
102
104
  let(:either) { described_class.new(value) }
103
- let(:value) { Fear.left('error') }
105
+ let(:value) { Fear.left("error") }
104
106
 
105
- it 'returns value' do
106
- is_expected.to eq(Fear.left('error'))
107
+ it "returns value" do
108
+ is_expected.to eq(Fear.left("error"))
107
109
  end
108
110
  end
109
111
 
110
- context 'value is not Either' do
112
+ context "value is not Either" do
111
113
  subject { proc { left.join_left } }
112
114
 
113
- it 'fails with type error' do
115
+ it "fails with type error" do
114
116
  is_expected.to raise_error(TypeError)
115
117
  end
116
118
  end
117
119
  end
118
120
 
119
- describe '#===' do
121
+ describe "#===" do
120
122
  subject { match === left }
121
123
 
122
- context 'matches erectly' do
123
- let(:match) { Fear.left('value') }
124
+ context "matches erectly" do
125
+ let(:match) { Fear.left("value") }
124
126
  it { is_expected.to eq(true) }
125
127
  end
126
128
 
127
- context 'value does not match' do
128
- let(:match) { Fear.left('error') }
129
+ context "value does not match" do
130
+ let(:match) { Fear.left("error") }
129
131
  it { is_expected.to eq(false) }
130
132
  end
131
133
 
132
- context 'matches by class' do
134
+ context "matches by class" do
133
135
  let(:match) { Fear.left(String) }
134
136
  it { is_expected.to eq(true) }
135
137
  end
136
138
 
137
- context 'does not matches by class' do
139
+ context "does not matches by class" do
138
140
  let(:match) { Fear.left(Integer) }
139
141
  it { is_expected.to eq(false) }
140
142
  end
143
+
144
+ context "does non-either" do
145
+ let(:match) { Fear.left(42) }
146
+ let(:left) { 42 }
147
+
148
+ it { is_expected.to eq(false) }
149
+ end
141
150
  end
142
151
 
143
- describe '#match' do
144
- context 'matched' do
152
+ describe "#match" do
153
+ context "matched" do
145
154
  subject do
146
155
  left.match do |m|
147
156
  m.left(->(x) { x.length < 2 }) { |x| "Left: #{x}" }
@@ -150,15 +159,15 @@ RSpec.describe Fear::Left do
150
159
  end
151
160
  end
152
161
 
153
- it { is_expected.to eq('Left: value') }
162
+ it { is_expected.to eq("Left: value") }
154
163
  end
155
164
 
156
- context 'nothing matched and no else given' do
165
+ context "nothing matched and no else given" do
157
166
  subject do
158
167
  proc do
159
168
  left.match do |m|
160
169
  m.left(->(x) { x.length < 2 }) { |x| "Left: #{x}" }
161
- m.right { |_| 'noop' }
170
+ m.right { |_| "noop" }
162
171
  end
163
172
  end
164
173
  end
@@ -166,7 +175,7 @@ RSpec.describe Fear::Left do
166
175
  it { is_expected.to raise_error(Fear::MatchError) }
167
176
  end
168
177
 
169
- context 'nothing matched and else given' do
178
+ context "nothing matched and else given" do
170
179
  subject do
171
180
  left.match do |m|
172
181
  m.left(->(x) { x.length < 2 }) { |x| "Left: #{x}" }
@@ -178,31 +187,9 @@ RSpec.describe Fear::Left do
178
187
  end
179
188
  end
180
189
 
181
- describe '#to_s' do
190
+ describe "#to_s" do
182
191
  subject { left.to_s }
183
192
 
184
193
  it { is_expected.to eq('#<Fear::Left value="value">') }
185
194
  end
186
-
187
- describe 'pattern matching' do
188
- subject { Fear.xcase('Left(v : Integer)') { |v:| "matched #{v}" }.call_or_else(var) { 'nothing' } }
189
-
190
- context 'left of int' do
191
- let(:var) { Fear.left(42) }
192
-
193
- it { is_expected.to eq('matched 42') }
194
- end
195
-
196
- context 'left of string' do
197
- let(:var) { Fear.left('42') }
198
-
199
- it { is_expected.to eq('nothing') }
200
- end
201
-
202
- context 'not left' do
203
- let(:var) { '42' }
204
-
205
- it { is_expected.to eq('nothing') }
206
- end
207
- end
208
195
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::None do
2
4
  it_behaves_like Fear::RightBiased::Left do
3
5
  let(:left) { Fear.none }
@@ -5,105 +7,115 @@ RSpec.describe Fear::None do
5
7
 
6
8
  subject(:none) { Fear.none }
7
9
 
8
- describe '#get' do
10
+ describe "#get" do
9
11
  subject { proc { none.get } }
10
12
  it { is_expected.to raise_error(Fear::NoSuchElementError) }
11
13
  end
12
14
 
13
- describe '#or_nil' do
15
+ describe "#or_nil" do
14
16
  subject { none.or_nil }
15
17
  it { is_expected.to eq(nil) }
16
18
  end
17
19
 
18
- describe '#or_else' do
20
+ describe "#or_else" do
19
21
  subject { none.or_else { alternative } }
20
22
  let(:alternative) { Fear.some(42) }
21
23
 
22
- it 'returns alternative' do
24
+ it "returns alternative" do
23
25
  is_expected.to eq(alternative)
24
26
  end
25
27
  end
26
28
 
27
- describe '#empty?' do
29
+ describe "#empty?" do
28
30
  subject { none.empty? }
29
31
  it { is_expected.to eq(true) }
30
32
  end
31
33
 
32
- describe '#select' do
34
+ describe "#blank?" do
35
+ subject { none.blank? }
36
+ it { is_expected.to eq(true) }
37
+ end
38
+
39
+ describe "#present?" do
40
+ subject { none.present? }
41
+ it { is_expected.to be_falsey }
42
+ end
43
+
44
+ describe "#select" do
33
45
  subject { none.select { |value| value > 42 } }
34
46
 
35
- it 'always return None' do
47
+ it "always return None" do
36
48
  is_expected.to eq(Fear.none)
37
49
  end
38
50
  end
39
51
 
40
- describe '#reject' do
52
+ describe "#reject" do
41
53
  subject { none.reject { |value| value > 42 } }
42
54
 
43
- it 'always return None' do
55
+ it "always return None" do
44
56
  is_expected.to eq(Fear.none)
45
57
  end
46
58
  end
47
59
 
48
- describe '.new' do
60
+ describe ".new" do
49
61
  subject { Fear::None.class.new }
50
62
 
51
63
  it { is_expected.to eq(Fear::None) }
52
64
  end
53
65
 
54
- describe '.inherited' do
66
+ describe ".inherited" do
55
67
  subject { -> { Class.new(Fear.none.class) } }
56
68
 
57
- it 'raises error' do
58
- is_expected.to raise_error(RuntimeError, 'you are not allowed to inherit from NoneClass, use Fear::None instead')
69
+ it "raises error" do
70
+ is_expected.to raise_error(RuntimeError, "you are not allowed to inherit from NoneClass, use Fear::None instead")
59
71
  end
60
72
  end
61
73
 
62
- describe '#to_s' do
74
+ describe "#to_s" do
63
75
  subject { none.to_s }
64
76
 
65
- it { is_expected.to eq('#<Fear::NoneClass>') }
77
+ it { is_expected.to eq("#<Fear::NoneClass>") }
66
78
  end
67
79
 
68
- describe '#inspect' do
80
+ describe "#inspect" do
69
81
  subject { none.inspect }
70
82
 
71
- it { is_expected.to eq('#<Fear::NoneClass>') }
83
+ it { is_expected.to eq("#<Fear::NoneClass>") }
72
84
  end
73
85
 
74
- describe '#===' do
75
- context 'None' do
86
+ describe "#===" do
87
+ context "None" do
76
88
  subject { Fear::None === none }
77
89
 
78
90
  it { is_expected.to eq(true) }
79
91
  end
80
92
 
81
- context 'Fear::Some' do
93
+ context "Fear::Some" do
82
94
  subject { Fear::None === Fear.some(4) }
83
95
 
84
96
  it { is_expected.to eq(false) }
85
97
  end
86
98
 
87
- context 'Integer' do
99
+ context "Integer" do
88
100
  subject { Fear::None === 4 }
89
101
 
90
102
  it { is_expected.to eq(false) }
91
103
  end
92
104
  end
93
105
 
94
- describe '#match' do
95
- context 'matched' do
106
+ describe "#match" do
107
+ context "matched" do
96
108
  subject do
97
109
  none.match do |m|
98
110
  m.some { |x| x * 2 }
99
- m.none { 'noop' }
111
+ m.none { "noop" }
100
112
  end
101
113
  end
102
114
 
103
- it { is_expected.to eq('noop') }
115
+ it { is_expected.to eq("noop") }
104
116
  end
105
117
 
106
- context 'nothing matched and no else given' do
118
+ context "nothing matched and no else given" do
107
119
  subject do
108
120
  proc do
109
121
  none.match do |m|
@@ -115,7 +127,7 @@ RSpec.describe Fear::None do
115
127
  it { is_expected.to raise_error(Fear::MatchError) }
116
128
  end
117
129
 
118
- context 'nothing matched and else given' do
130
+ context "nothing matched and else given" do
119
131
  subject do
120
132
  none.match do |m|
121
133
  m.some { |x| x * 2 }
@@ -126,20 +138,4 @@ RSpec.describe Fear::None do
126
138
  it { is_expected.to eq(:default) }
127
139
  end
128
140
  end
129
-
130
- describe 'pattern matching' do
131
- subject { Fear.xcase('None()') { 'matched' }.call_or_else(var) { 'nothing' } }
132
-
133
- context 'none' do
134
- let(:var) { Fear.none }
135
-
136
- it { is_expected.to eq('matched') }
137
- end
138
-
139
- context 'not none' do
140
- let(:var) { '42' }
141
-
142
- it { is_expected.to eq('nothing') }
143
- end
144
- end
145
141
  end