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.
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)