fear 2.0.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/spec.yml +1 -5
  3. data/CHANGELOG.md +8 -0
  4. data/Gemfile +14 -2
  5. data/Gemfile.lock +48 -61
  6. data/LICENSE.txt +1 -1
  7. data/README.md +18 -70
  8. data/Rakefile +32 -119
  9. data/benchmarks/dry_do_vs_fear_for.txt +7 -6
  10. data/benchmarks/dry_some_fmap_vs_fear_some_map.txt +7 -6
  11. data/benchmarks/factorial.txt +7 -9
  12. data/benchmarks/fear_gaurd_and1_vs_new.txt +7 -6
  13. data/benchmarks/fear_gaurd_and2_vs_and.txt +8 -7
  14. data/benchmarks/fear_gaurd_and3_vs_and_and.txt +7 -6
  15. data/benchmarks/fear_pattern_matching_construction_vs_execution.txt +7 -6
  16. data/benchmarks/pattern_matching_dry_vs_qo_vs_fear_try.txt +8 -10
  17. data/fear.gemspec +4 -19
  18. data/lib/fear/either/left_projection.rb +237 -0
  19. data/lib/fear/either/pattern_match.rb +49 -0
  20. data/lib/fear/either.rb +20 -11
  21. data/lib/fear/either_api.rb +2 -4
  22. data/lib/fear/empty_partial_function.rb +1 -1
  23. data/lib/fear/failure/pattern_match.rb +14 -0
  24. data/lib/fear/failure.rb +1 -1
  25. data/lib/fear/for_api.rb +0 -2
  26. data/lib/fear/future.rb +1 -1
  27. data/lib/fear/future_api.rb +0 -5
  28. data/lib/fear/left/pattern_match.rb +15 -0
  29. data/lib/fear/left.rb +1 -1
  30. data/lib/fear/none.rb +0 -87
  31. data/lib/fear/none_class/pattern_match.rb +16 -0
  32. data/lib/fear/none_class.rb +85 -0
  33. data/lib/fear/option/pattern_match.rb +47 -0
  34. data/lib/fear/option.rb +1 -5
  35. data/lib/fear/option_api.rb +1 -3
  36. data/lib/fear/partial_function/empty.rb +3 -5
  37. data/lib/fear/partial_function/guard.rb +0 -4
  38. data/lib/fear/partial_function/or_else.rb +0 -2
  39. data/lib/fear/partial_function.rb +0 -9
  40. data/lib/fear/partial_function_class.rb +1 -1
  41. data/lib/fear/pattern_match.rb +3 -2
  42. data/lib/fear/pattern_matching_api.rb +0 -3
  43. data/lib/fear/right/pattern_match.rb +15 -0
  44. data/lib/fear/right.rb +1 -1
  45. data/lib/fear/right_biased.rb +2 -0
  46. data/lib/fear/some/pattern_match.rb +15 -0
  47. data/lib/fear/some.rb +1 -1
  48. data/lib/fear/success/pattern_match.rb +16 -0
  49. data/lib/fear/success.rb +1 -1
  50. data/lib/fear/try/pattern_match.rb +29 -0
  51. data/lib/fear/try.rb +3 -7
  52. data/lib/fear/try_api.rb +0 -2
  53. data/lib/fear/version.rb +1 -1
  54. data/lib/fear.rb +3 -14
  55. data/spec/fear/awaitable_spec.rb +0 -2
  56. data/spec/fear/either/left_projection_spec.rb +289 -0
  57. data/spec/fear/{either_pattern_match_spec.rb → either/pattern_match_spec.rb} +1 -1
  58. data/spec/fear/{option_pattern_match_spec.rb → option/pattern_match_spec.rb} +1 -1
  59. data/spec/fear/partial_function/empty_spec.rb +1 -1
  60. data/spec/fear/{try_pattern_match_spec.rb → try/try_pattern_match_spec.rb} +1 -1
  61. data/spec/support/.keep +0 -0
  62. metadata +29 -255
  63. data/benchmarks/fear_pattern_extracting_with_vs_without_cache.txt +0 -11
  64. data/benchmarks/pattern_matching_qo_vs_fear_pattern_extraction.txt +0 -11
  65. data/benchmarks/pattern_matching_qo_vs_fear_try_execution.txt +0 -11
  66. data/lib/dry/types/fear/option.rb +0 -125
  67. data/lib/dry/types/fear.rb +0 -8
  68. data/lib/fear/either_pattern_match.rb +0 -52
  69. data/lib/fear/failure_pattern_match.rb +0 -12
  70. data/lib/fear/left_pattern_match.rb +0 -11
  71. data/lib/fear/none_pattern_match.rb +0 -14
  72. data/lib/fear/option_pattern_match.rb +0 -50
  73. data/lib/fear/right_pattern_match.rb +0 -13
  74. data/lib/fear/some_pattern_match.rb +0 -13
  75. data/lib/fear/struct.rb +0 -237
  76. data/lib/fear/success_pattern_match.rb +0 -14
  77. data/lib/fear/try_pattern_match.rb +0 -32
  78. data/spec/dry/types/fear/option/constrained_spec.rb +0 -22
  79. data/spec/dry/types/fear/option/core_spec.rb +0 -77
  80. data/spec/dry/types/fear/option/default_spec.rb +0 -21
  81. data/spec/dry/types/fear/option/hash_spec.rb +0 -58
  82. data/spec/dry/types/fear/option/option_spec.rb +0 -97
  83. data/spec/struct_pattern_matching_spec.rb +0 -36
  84. data/spec/struct_spec.rb +0 -194
  85. 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
@@ -1,6 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "dry/types/fear"
4
- require "dry/types/spec/types"
5
-
6
- Dry::Types.load_extensions(:fear_option)