fear 2.0.1 → 3.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.
- checksums.yaml +4 -4
- data/.github/workflows/spec.yml +1 -5
- data/CHANGELOG.md +8 -0
- data/Gemfile +14 -2
- data/Gemfile.lock +48 -61
- data/LICENSE.txt +1 -1
- data/README.md +18 -70
- data/Rakefile +32 -119
- data/benchmarks/dry_do_vs_fear_for.txt +7 -6
- data/benchmarks/dry_some_fmap_vs_fear_some_map.txt +7 -6
- data/benchmarks/factorial.txt +7 -9
- data/benchmarks/fear_gaurd_and1_vs_new.txt +7 -6
- data/benchmarks/fear_gaurd_and2_vs_and.txt +8 -7
- data/benchmarks/fear_gaurd_and3_vs_and_and.txt +7 -6
- data/benchmarks/fear_pattern_matching_construction_vs_execution.txt +7 -6
- data/benchmarks/pattern_matching_dry_vs_qo_vs_fear_try.txt +8 -10
- data/fear.gemspec +4 -19
- data/lib/fear/either/left_projection.rb +237 -0
- data/lib/fear/either/pattern_match.rb +49 -0
- data/lib/fear/either.rb +20 -11
- data/lib/fear/either_api.rb +2 -4
- data/lib/fear/empty_partial_function.rb +1 -1
- data/lib/fear/failure/pattern_match.rb +14 -0
- data/lib/fear/failure.rb +1 -1
- data/lib/fear/for_api.rb +0 -2
- data/lib/fear/future.rb +1 -1
- data/lib/fear/future_api.rb +0 -5
- data/lib/fear/left/pattern_match.rb +15 -0
- data/lib/fear/left.rb +1 -1
- data/lib/fear/none.rb +0 -87
- data/lib/fear/none_class/pattern_match.rb +16 -0
- data/lib/fear/none_class.rb +85 -0
- data/lib/fear/option/pattern_match.rb +47 -0
- data/lib/fear/option.rb +1 -5
- data/lib/fear/option_api.rb +1 -3
- data/lib/fear/partial_function/empty.rb +3 -5
- data/lib/fear/partial_function/guard.rb +0 -4
- data/lib/fear/partial_function/or_else.rb +0 -2
- data/lib/fear/partial_function.rb +0 -9
- data/lib/fear/partial_function_class.rb +1 -1
- data/lib/fear/pattern_match.rb +3 -2
- data/lib/fear/pattern_matching_api.rb +0 -3
- data/lib/fear/right/pattern_match.rb +15 -0
- data/lib/fear/right.rb +1 -1
- data/lib/fear/right_biased.rb +2 -0
- data/lib/fear/some/pattern_match.rb +15 -0
- data/lib/fear/some.rb +1 -1
- data/lib/fear/success/pattern_match.rb +16 -0
- data/lib/fear/success.rb +1 -1
- data/lib/fear/try/pattern_match.rb +29 -0
- data/lib/fear/try.rb +3 -7
- data/lib/fear/try_api.rb +0 -2
- data/lib/fear/version.rb +1 -1
- data/lib/fear.rb +3 -14
- data/spec/fear/awaitable_spec.rb +0 -2
- data/spec/fear/either/left_projection_spec.rb +289 -0
- data/spec/fear/{either_pattern_match_spec.rb → either/pattern_match_spec.rb} +1 -1
- data/spec/fear/{option_pattern_match_spec.rb → option/pattern_match_spec.rb} +1 -1
- data/spec/fear/partial_function/empty_spec.rb +1 -1
- data/spec/fear/{try_pattern_match_spec.rb → try/try_pattern_match_spec.rb} +1 -1
- data/spec/support/.keep +0 -0
- metadata +29 -255
- data/benchmarks/fear_pattern_extracting_with_vs_without_cache.txt +0 -11
- data/benchmarks/pattern_matching_qo_vs_fear_pattern_extraction.txt +0 -11
- data/benchmarks/pattern_matching_qo_vs_fear_try_execution.txt +0 -11
- data/lib/dry/types/fear/option.rb +0 -125
- data/lib/dry/types/fear.rb +0 -8
- data/lib/fear/either_pattern_match.rb +0 -52
- data/lib/fear/failure_pattern_match.rb +0 -12
- data/lib/fear/left_pattern_match.rb +0 -11
- data/lib/fear/none_pattern_match.rb +0 -14
- data/lib/fear/option_pattern_match.rb +0 -50
- data/lib/fear/right_pattern_match.rb +0 -13
- data/lib/fear/some_pattern_match.rb +0 -13
- data/lib/fear/struct.rb +0 -237
- data/lib/fear/success_pattern_match.rb +0 -14
- data/lib/fear/try_pattern_match.rb +0 -32
- data/spec/dry/types/fear/option/constrained_spec.rb +0 -22
- data/spec/dry/types/fear/option/core_spec.rb +0 -77
- data/spec/dry/types/fear/option/default_spec.rb +0 -21
- data/spec/dry/types/fear/option/hash_spec.rb +0 -58
- data/spec/dry/types/fear/option/option_spec.rb +0 -97
- data/spec/struct_pattern_matching_spec.rb +0 -36
- data/spec/struct_spec.rb +0 -194
- data/spec/support/dry_types.rb +0 -6
data/spec/struct_spec.rb
DELETED
@@ -1,194 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Fear::Struct do
|
4
|
-
describe ".with_attributes" do
|
5
|
-
context "same arguments" do
|
6
|
-
subject { struct_class.new(a: 42, b: 43) }
|
7
|
-
|
8
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
9
|
-
|
10
|
-
it { is_expected.to have_attributes(a: 42, b: 43) }
|
11
|
-
end
|
12
|
-
|
13
|
-
context "string arguments" do
|
14
|
-
subject { -> { struct_class.new("a" => 42, "b" => 43) } }
|
15
|
-
|
16
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
17
|
-
|
18
|
-
it { is_expected.to raise_error(ArgumentError) }
|
19
|
-
end
|
20
|
-
|
21
|
-
context "extra argument" do
|
22
|
-
subject { -> { struct_class.new(a: 42, b: 41, c: 43, d: 44) } }
|
23
|
-
|
24
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
25
|
-
|
26
|
-
it { is_expected.to raise_error(ArgumentError, "unknown keywords: c, d") }
|
27
|
-
end
|
28
|
-
|
29
|
-
context "missing argument" do
|
30
|
-
subject { -> { struct_class.new } }
|
31
|
-
|
32
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
33
|
-
|
34
|
-
it { is_expected.to raise_error(ArgumentError, "missing keywords: a, b") }
|
35
|
-
end
|
36
|
-
|
37
|
-
context "inheritance" do
|
38
|
-
let(:parent_struct) { described_class.with_attributes(:a, :b) }
|
39
|
-
|
40
|
-
it "does not change parent attributes" do
|
41
|
-
expect do
|
42
|
-
parent_struct.with_attributes(:c)
|
43
|
-
end.not_to change { parent_struct.attributes }.from([:a, :b])
|
44
|
-
end
|
45
|
-
|
46
|
-
it "extends parent attributes" do
|
47
|
-
child_struct = parent_struct.with_attributes(:c)
|
48
|
-
expect(child_struct.attributes).to eq([:a, :b, :c])
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
context "with block" do
|
53
|
-
subject { struct_class.new(a: 42, b: 43).a_plus_b }
|
54
|
-
|
55
|
-
let(:struct_class) do
|
56
|
-
described_class.with_attributes(:a, :b) do
|
57
|
-
def a_plus_b
|
58
|
-
a + b
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
it "evaluates block in context of struct" do
|
64
|
-
is_expected.to eq(85)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
describe "#==" do
|
70
|
-
context "with members" do
|
71
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
72
|
-
|
73
|
-
context "same class and members" do
|
74
|
-
subject { struct_class.new(a: 42, b: 43) == struct_class.new(a: 42, b: 43) } # rubocop: disable Lint/BinaryOperatorWithIdenticalOperands
|
75
|
-
|
76
|
-
it { is_expected.to eq(true) }
|
77
|
-
end
|
78
|
-
|
79
|
-
context "same class and different members" do
|
80
|
-
subject { struct_class.new(a: 42, b: 43) == struct_class.new(a: 42, b: 0) }
|
81
|
-
|
82
|
-
it { is_expected.to eq(false) }
|
83
|
-
end
|
84
|
-
|
85
|
-
context "different class and same members" do
|
86
|
-
subject { struct_class.new(a: 42, b: 43) == struct_class_1.new(a: 42, b: 43) }
|
87
|
-
|
88
|
-
let(:struct_class_1) { described_class.with_attributes(:a, :b) }
|
89
|
-
|
90
|
-
it { is_expected.to eq(true) }
|
91
|
-
end
|
92
|
-
|
93
|
-
context "different class and different members" do
|
94
|
-
subject { struct_class.new(a: 42, b: 43) == struct_class.new(a: 42, b: 0) }
|
95
|
-
|
96
|
-
let(:struct_class_1) { described_class.with_attributes(:a, :b) }
|
97
|
-
|
98
|
-
it { is_expected.to eq(false) }
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
describe "#members" do
|
104
|
-
let(:struct) { struct_class.new(b: 43, a: 42) }
|
105
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
106
|
-
|
107
|
-
it "returns members in the order they defined" do
|
108
|
-
expect(struct.members).to eq([:a, :b])
|
109
|
-
end
|
110
|
-
|
111
|
-
it "is immutable" do
|
112
|
-
expect { struct.members << :c }.not_to change { struct.members }.from([:a, :b])
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
describe "#to_a" do
|
117
|
-
let(:struct) { struct_class.new(b: 43, a: 42) }
|
118
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
119
|
-
|
120
|
-
it "returns members values in the order they defined" do
|
121
|
-
expect(struct.to_a).to eq([42, 43])
|
122
|
-
end
|
123
|
-
|
124
|
-
it "is immutable" do
|
125
|
-
expect { struct.to_a << 44 }.not_to change { struct.to_a }.from([42, 43])
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
describe "#to_h" do
|
130
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
131
|
-
|
132
|
-
context "without block" do
|
133
|
-
let(:struct) { struct_class.new(b: 43, a: 42) }
|
134
|
-
|
135
|
-
it "returns a Hash containing the names and values for the structs members" do
|
136
|
-
expect(struct.to_h).to eq(a: 42, b: 43)
|
137
|
-
end
|
138
|
-
|
139
|
-
it "is immutable" do
|
140
|
-
expect { struct.to_h.merge(c: 44) }.not_to change { struct.to_h }.from(a: 42, b: 43)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
context "with block" do
|
145
|
-
subject do
|
146
|
-
struct.to_h do |key, value|
|
147
|
-
[key.upcase, value / 2]
|
148
|
-
end
|
149
|
-
end
|
150
|
-
let(:struct) { struct_class.new(b: 2, a: 4) }
|
151
|
-
|
152
|
-
it "returns a Hash containing the names and values for the structs members" do
|
153
|
-
is_expected.to eq(A: 2, B: 1)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe "#copy" do
|
159
|
-
let(:struct_class) { described_class.with_attributes(:a, :b) }
|
160
|
-
let(:struct) { struct_class.new(b: 43, a: 42) }
|
161
|
-
|
162
|
-
context "attributes given" do
|
163
|
-
subject { struct.copy(b: 44) }
|
164
|
-
|
165
|
-
it { is_expected.to eq(struct_class.new(a: 42, b: 44)) }
|
166
|
-
end
|
167
|
-
|
168
|
-
context "string attributes" do
|
169
|
-
subject { -> { struct.copy("a" => 44) } }
|
170
|
-
|
171
|
-
it { is_expected.to raise_error(ArgumentError) }
|
172
|
-
end
|
173
|
-
|
174
|
-
context "no attributes given" do
|
175
|
-
subject { struct.copy == struct }
|
176
|
-
|
177
|
-
it { is_expected.to eq(true) }
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
describe "#inspect" do
|
182
|
-
subject { StrInspect.new(a: 2, b: nil).inspect }
|
183
|
-
StrInspect = Fear::Struct.with_attributes(:a, :b)
|
184
|
-
|
185
|
-
it { is_expected.to eq("<#Fear::Struct StrInspect a=2, b=nil>") }
|
186
|
-
end
|
187
|
-
|
188
|
-
describe "#inspect" do
|
189
|
-
subject { StrToS.new(a: 2, b: nil).inspect }
|
190
|
-
StrToS = Fear::Struct.with_attributes(:a, :b)
|
191
|
-
|
192
|
-
it { is_expected.to eq("<#Fear::Struct StrToS a=2, b=nil>") }
|
193
|
-
end
|
194
|
-
end
|