fear 0.11.0 → 1.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 (110) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +18 -0
  4. data/.travis.yml +0 -3
  5. data/CHANGELOG.md +12 -1
  6. data/Gemfile +1 -0
  7. data/{gemfiles/dry_equalizer_0.2.1.gemfile.lock → Gemfile.lock} +21 -12
  8. data/README.md +594 -241
  9. data/Rakefile +166 -219
  10. data/benchmarks/README.md +1 -0
  11. data/benchmarks/dry_do_vs_fear_for.txt +11 -0
  12. data/benchmarks/dry_some_fmap_vs_fear_some_map.txt +11 -0
  13. data/benchmarks/factorial.txt +16 -0
  14. data/benchmarks/fear_gaurd_and1_vs_new.txt +13 -0
  15. data/benchmarks/fear_gaurd_and2_vs_and.txt +13 -0
  16. data/benchmarks/fear_gaurd_and3_vs_and_and.txt +13 -0
  17. data/benchmarks/fear_pattern_extracting_with_vs_without_cache.txt +11 -0
  18. data/benchmarks/fear_pattern_matching_construction_vs_execution.txt +13 -0
  19. data/benchmarks/pattern_matching_dry_vs_qo_vs_fear_try.txt +14 -0
  20. data/benchmarks/pattern_matching_qo_vs_fear_pattern_extraction.txt +11 -0
  21. data/benchmarks/pattern_matching_qo_vs_fear_try_execution.txt +11 -0
  22. data/examples/pattern_extracting.rb +15 -0
  23. data/examples/pattern_matching_binary_tree_set.rb +96 -0
  24. data/examples/pattern_matching_number_in_words.rb +54 -0
  25. data/fear.gemspec +4 -2
  26. data/lib/fear.rb +21 -4
  27. data/lib/fear/either.rb +77 -59
  28. data/lib/fear/either_api.rb +21 -0
  29. data/lib/fear/empty_partial_function.rb +1 -1
  30. data/lib/fear/extractor.rb +108 -0
  31. data/lib/fear/extractor/anonymous_array_splat_matcher.rb +8 -0
  32. data/lib/fear/extractor/any_matcher.rb +15 -0
  33. data/lib/fear/extractor/array_head_matcher.rb +34 -0
  34. data/lib/fear/extractor/array_matcher.rb +38 -0
  35. data/lib/fear/extractor/array_splat_matcher.rb +14 -0
  36. data/lib/fear/extractor/empty_list_matcher.rb +18 -0
  37. data/lib/fear/extractor/extractor_matcher.rb +42 -0
  38. data/lib/fear/extractor/grammar.rb +201 -0
  39. data/lib/fear/extractor/grammar.treetop +129 -0
  40. data/lib/fear/extractor/identifier_matcher.rb +16 -0
  41. data/lib/fear/extractor/matcher.rb +54 -0
  42. data/lib/fear/extractor/matcher/and.rb +36 -0
  43. data/lib/fear/extractor/named_array_splat_matcher.rb +15 -0
  44. data/lib/fear/extractor/pattern.rb +55 -0
  45. data/lib/fear/extractor/typed_identifier_matcher.rb +24 -0
  46. data/lib/fear/extractor/value_matcher.rb +17 -0
  47. data/lib/fear/extractor_api.rb +33 -0
  48. data/lib/fear/failure.rb +32 -10
  49. data/lib/fear/for.rb +14 -69
  50. data/lib/fear/for_api.rb +66 -0
  51. data/lib/fear/future.rb +414 -0
  52. data/lib/fear/future_api.rb +19 -0
  53. data/lib/fear/left.rb +8 -0
  54. data/lib/fear/none.rb +17 -8
  55. data/lib/fear/option.rb +55 -49
  56. data/lib/fear/option_api.rb +38 -0
  57. data/lib/fear/partial_function.rb +9 -12
  58. data/lib/fear/partial_function/empty.rb +1 -1
  59. data/lib/fear/partial_function/guard.rb +8 -20
  60. data/lib/fear/partial_function/lifted.rb +1 -0
  61. data/lib/fear/partial_function_class.rb +10 -0
  62. data/lib/fear/pattern_match.rb +10 -0
  63. data/lib/fear/pattern_matching_api.rb +35 -11
  64. data/lib/fear/promise.rb +87 -0
  65. data/lib/fear/right.rb +8 -0
  66. data/lib/fear/some.rb +22 -3
  67. data/lib/fear/success.rb +22 -1
  68. data/lib/fear/try.rb +82 -67
  69. data/lib/fear/try_api.rb +31 -0
  70. data/lib/fear/unit.rb +28 -0
  71. data/lib/fear/version.rb +1 -1
  72. data/spec/fear/done_spec.rb +3 -3
  73. data/spec/fear/either/mixin_spec.rb +15 -0
  74. data/spec/fear/either_pattern_match_spec.rb +10 -12
  75. data/spec/fear/extractor/array_matcher_spec.rb +228 -0
  76. data/spec/fear/extractor/extractor_matcher_spec.rb +151 -0
  77. data/spec/fear/extractor/grammar_array_spec.rb +23 -0
  78. data/spec/fear/extractor/identified_matcher_spec.rb +47 -0
  79. data/spec/fear/extractor/identifier_matcher_spec.rb +66 -0
  80. data/spec/fear/extractor/pattern_spec.rb +32 -0
  81. data/spec/fear/extractor/typed_identifier_matcher_spec.rb +62 -0
  82. data/spec/fear/extractor/value_matcher_number_spec.rb +77 -0
  83. data/spec/fear/extractor/value_matcher_string_spec.rb +86 -0
  84. data/spec/fear/extractor/value_matcher_symbol_spec.rb +69 -0
  85. data/spec/fear/extractor_api_spec.rb +113 -0
  86. data/spec/fear/extractor_spec.rb +59 -0
  87. data/spec/fear/failure_spec.rb +73 -13
  88. data/spec/fear/for_spec.rb +35 -35
  89. data/spec/fear/future_spec.rb +466 -0
  90. data/spec/fear/guard_spec.rb +4 -4
  91. data/spec/fear/left_spec.rb +40 -14
  92. data/spec/fear/none_spec.rb +28 -12
  93. data/spec/fear/option/mixin_spec.rb +37 -0
  94. data/spec/fear/option_pattern_match_spec.rb +7 -9
  95. data/spec/fear/partial_function_spec.rb +25 -3
  96. data/spec/fear/pattern_match_spec.rb +33 -1
  97. data/spec/fear/promise_spec.rb +94 -0
  98. data/spec/fear/right_spec.rb +37 -9
  99. data/spec/fear/some_spec.rb +32 -6
  100. data/spec/fear/success_spec.rb +32 -4
  101. data/spec/fear/try/mixin_spec.rb +17 -0
  102. data/spec/fear/try_pattern_match_spec.rb +8 -10
  103. data/spec/spec_helper.rb +1 -1
  104. metadata +115 -20
  105. data/Appraisals +0 -32
  106. data/gemfiles/dry_equalizer_0.1.0.gemfile +0 -8
  107. data/gemfiles/dry_equalizer_0.1.0.gemfile.lock +0 -82
  108. data/gemfiles/dry_equalizer_0.2.1.gemfile +0 -8
  109. data/lib/fear/done.rb +0 -22
  110. data/spec/fear/option_spec.rb +0 -15
@@ -0,0 +1,19 @@
1
+ module Fear
2
+ # rubocop: disable Metrics/LineLength
3
+ module FutureApi
4
+ # Asynchronously evaluates the block
5
+ # @param options [Hash] options will be passed directly to underlying +Concurrent::Promise+
6
+ # @see https://ruby-concurrency.github.io/concurrent-ruby/1.1.5/Concurrent/Promise.html#constructor_details Constructor Details
7
+ # @return [Fear::Future]
8
+ #
9
+ # @example
10
+ # require 'open-uri'
11
+ # f = Fear.future(executor: :io) { open('http://example.com') }
12
+ # f.map(&:read).each { |body| puts body }
13
+ #
14
+ def future(options = {}, &block)
15
+ Future.new(options, &block)
16
+ end
17
+ end
18
+ # rubocop: enable Metrics/LineLength
19
+ end
@@ -4,6 +4,14 @@ module Fear
4
4
  include RightBiased::Left
5
5
  include LeftPatternMatch.mixin
6
6
 
7
+ EXTRACTOR = proc do |either|
8
+ if Fear::Left === either
9
+ Fear.some([either.left_value])
10
+ else
11
+ Fear.none
12
+ end
13
+ end
14
+
7
15
  # @api private
8
16
  def left_value
9
17
  value
@@ -2,10 +2,17 @@ module Fear
2
2
  # @api private
3
3
  class NoneClass
4
4
  include Option
5
- include Dry::Equalizer()
6
5
  include RightBiased::Left
7
6
  include NonePatternMatch.mixin
8
7
 
8
+ EXTRACTOR = proc do |option|
9
+ if Fear::None === option
10
+ Fear.some([])
11
+ else
12
+ Fear.none
13
+ end
14
+ end
15
+
9
16
  # @raise [NoSuchElementError]
10
17
  def get
11
18
  raise NoSuchElementError
@@ -31,16 +38,18 @@ module Fear
31
38
  self
32
39
  end
33
40
 
34
- AS_STRING = 'Fear::None'.freeze
35
-
36
41
  # @return [String]
37
- def to_s
38
- AS_STRING
42
+ def inspect
43
+ '#<Fear::NoneClass>'
39
44
  end
40
45
 
41
46
  # @return [String]
42
- def inspect
43
- AS_STRING
47
+ alias to_s inspect
48
+
49
+ # @param other [Any]
50
+ # @return [Boolean]
51
+ def ==(other)
52
+ other.is_a?(NoneClass)
44
53
  end
45
54
 
46
55
  # @param other
@@ -60,7 +69,7 @@ module Fear
60
69
  None
61
70
  end
62
71
 
63
- def inherited
72
+ def inherited(*)
64
73
  raise 'you are not allowed to inherit from NoneClass, use Fear::None instead'
65
74
  end
66
75
  end
@@ -3,7 +3,7 @@ module Fear
3
3
  # are either an instance of +Some+ or the object +None+.
4
4
  #
5
5
  # @example The most idiomatic way to use an +Option+ instance is to treat it as a collection
6
- # name = Option(params[:name])
6
+ # name = Fear.option(params[:name])
7
7
  # upper = name.map(&:strip).select { |n| n.length != 0 }.map(&:upcase)
8
8
  # puts upper.get_or_else('')
9
9
  #
@@ -11,13 +11,13 @@ module Fear
11
11
  # having to check for the existence of a value.
12
12
  #
13
13
  # @example A less-idiomatic way to use +Option+ values is via pattern matching
14
- # Option(params[:name]).match do |m|
14
+ # Fear.option(params[:name]).match do |m|
15
15
  # m.some { |name| name.strip.upcase }
16
16
  # m.none { 'No name value' }
17
17
  # end
18
18
  #
19
19
  # @example or manually checking for non emptiness
20
- # name = Option(params[:name])
20
+ # name = Fear.option(params[:name])
21
21
  # if name.empty?
22
22
  # puts 'No name value'
23
23
  # else
@@ -31,21 +31,21 @@ module Fear
31
31
  # @yieldreturn [any]
32
32
  # @return [any]
33
33
  # @example
34
- # Some(42).get_or_else { 24/2 } #=> 42
35
- # None.get_or_else { 24/2 } #=> 12
34
+ # Fear.some(42).get_or_else { 24/2 } #=> 42
35
+ # Fear.none.get_or_else { 24/2 } #=> 12
36
36
  # @overload get_or_else(default)
37
37
  # @return [any]
38
38
  # @example
39
- # Some(42).get_or_else(12) #=> 42
40
- # None.get_or_else(12) #=> 12
39
+ # Fear.some(42).get_or_else(12) #=> 42
40
+ # Fear.none.get_or_else(12) #=> 12
41
41
  #
42
42
  # @!method or_else(&alternative)
43
43
  # Returns this +Some+ or the given alternative if this is a +None+.
44
44
  # @return [Option]
45
45
  # @example
46
- # Some(42).or_else { Some(21) } #=> Some(42)
47
- # None.or_else { Some(21) } #=> Some(21)
48
- # None.or_else { None } #=> None
46
+ # Fear.some(42).or_else { Fear.some(21) } #=> Fear.some(42)
47
+ # Fear.none.or_else { Fear.some(21) } #=> Fear.some(21)
48
+ # Fear.none.or_else { None } #=> None
49
49
  #
50
50
  # @!method include?(other_value)
51
51
  # Returns +true+ if it has an element that is equal
@@ -53,9 +53,9 @@ module Fear
53
53
  # @param [any]
54
54
  # @return [Boolean]
55
55
  # @example
56
- # Some(17).include?(17) #=> true
57
- # Some(17).include?(7) #=> false
58
- # None.include?(17) #=> false
56
+ # Fear.some(17).include?(17) #=> true
57
+ # Fear.some(17).include?(7) #=> false
58
+ # Fear.none.include?(17) #=> false
59
59
  #
60
60
  # @!method each(&block)
61
61
  # Performs the given block if this is a +Some+.
@@ -63,11 +63,11 @@ module Fear
63
63
  # @yieldreturn [void]
64
64
  # @return [Option] itself
65
65
  # @example
66
- # Some(17).each do |value|
66
+ # Fear.some(17).each do |value|
67
67
  # puts value
68
68
  # end #=> prints 17
69
69
  #
70
- # None.each do |value|
70
+ # Fear.none.each do |value|
71
71
  # puts value
72
72
  # end #=> does nothing
73
73
  #
@@ -77,8 +77,8 @@ module Fear
77
77
  # @yieldparam [any] value
78
78
  # @yieldreturn [any]
79
79
  # @example
80
- # Some(42).map { |v| v/2 } #=> Some(21)
81
- # None.map { |v| v/2 } #=> None
80
+ # Fear.some(42).map { |v| v/2 } #=> Fear.some(21)
81
+ # Fear.none.map { |v| v/2 } #=> None
82
82
  #
83
83
  # @!method flat_map(&block)
84
84
  # Returns the given block applied to the value from this +Some+
@@ -87,8 +87,8 @@ module Fear
87
87
  # @yieldreturn [Option]
88
88
  # @return [Option]
89
89
  # @example
90
- # Some(42).flat_map { |v| Some(v/2) } #=> Some(21)
91
- # None.flat_map { |v| Some(v/2) } #=> None
90
+ # Fear.some(42).flat_map { |v| Fear.some(v/2) } #=> Fear.some(21)
91
+ # Fear.none.flat_map { |v| Fear.some(v/2) } #=> None
92
92
  #
93
93
  # @!method any?(&predicate)
94
94
  # Returns +false+ if +None+ or returns the result of the
@@ -97,9 +97,9 @@ module Fear
97
97
  # @yieldreturn [Boolean]
98
98
  # @return [Boolean]
99
99
  # @example
100
- # Some(12).any?( |v| v > 10) #=> true
101
- # Some(7).any?( |v| v > 10) #=> false
102
- # None.any?( |v| v > 10) #=> false
100
+ # Fear.some(12).any?( |v| v > 10) #=> true
101
+ # Fear.some(7).any?( |v| v > 10) #=> false
102
+ # Fear.none.any?( |v| v > 10) #=> false
103
103
  #
104
104
  # @!method select(&predicate)
105
105
  # Returns self if it is nonempty and applying the predicate to this
@@ -108,9 +108,9 @@ module Fear
108
108
  # @yieldreturn [Boolean]
109
109
  # @return [Option]
110
110
  # @example
111
- # Some(42).select { |v| v > 40 } #=> Success(21)
112
- # Some(42).select { |v| v < 40 } #=> None
113
- # None.select { |v| v < 40 } #=> None
111
+ # Fear.some(42).select { |v| v > 40 } #=> Fear.success(21)
112
+ # Fear.some(42).select { |v| v < 40 } #=> None
113
+ # Fear.none.select { |v| v < 40 } #=> None
114
114
  #
115
115
  # @!method reject(&predicate)
116
116
  # Returns +Some+ if applying the predicate to this
@@ -119,9 +119,9 @@ module Fear
119
119
  # @yieldreturn [Boolean]
120
120
  # @return [Option]
121
121
  # @example
122
- # Some(42).reject { |v| v > 40 } #=> None
123
- # Some(42).reject { |v| v < 40 } #=> Some(42)
124
- # None.reject { |v| v < 40 } #=> None
122
+ # Fear.some(42).reject { |v| v > 40 } #=> None
123
+ # Fear.some(42).reject { |v| v < 40 } #=> Fear.some(42)
124
+ # Fear.none.reject { |v| v < 40 } #=> None
125
125
  #
126
126
  # @!method get
127
127
  # @return [any] the +Option+'s value.
@@ -131,14 +131,14 @@ module Fear
131
131
  # Returns +true+ if the +Option+ is +None+, +false+ otherwise.
132
132
  # @return [Boolean]
133
133
  # @example
134
- # Some(42).empty? #=> false
135
- # None.empty? #=> true
134
+ # Fear.some(42).empty? #=> false
135
+ # Fear.none.empty? #=> true
136
136
  #
137
137
  # @!method match(&matcher)
138
138
  # Pattern match against this +Option+
139
139
  # @yield matcher [Fear::OptionPatternMatch]
140
140
  # @example
141
- # Option(val).match do |m|
141
+ # Fear.option(val).match do |m|
142
142
  # m.some(Integer) do |x|
143
143
  # x * 2
144
144
  # end
@@ -166,8 +166,8 @@ module Fear
166
166
 
167
167
  class << self
168
168
  # Build pattern matcher to be used later, despite off
169
- # +Option#match+ method, id doesn't apply matcher immanently,
170
- # but build it instead. Unusually in sake of efficiency it's better
169
+ # +Option#match+ method, it doesn't apply matcher immanently,
170
+ # but build it instead. Usually in sake of efficiency it's better
171
171
  # to statically build matcher and reuse it later.
172
172
  #
173
173
  # @example
@@ -178,52 +178,58 @@ module Fear
178
178
  # m.none { 'NaN' }
179
179
  # m.else { 'error '}
180
180
  # end
181
- # matcher.call(Some(42))
181
+ # matcher.call(Fear.some(42))
182
182
  #
183
183
  # @yieldparam [OptionPatternMatch]
184
184
  # @return [Fear::PartialFunction]
185
185
  def matcher(&matcher)
186
186
  OptionPatternMatch.new(&matcher)
187
187
  end
188
+
189
+ def match(value, &block)
190
+ matcher(&block).call(value)
191
+ end
188
192
  end
189
193
 
190
194
  # Include this mixin to access convenient factory methods.
191
195
  # @example
192
196
  # include Fear::Option::Mixin
193
197
  #
194
- # Option(17) #=> #<Fear::Some value=17>
198
+ # Option(17) #=> #<Fear::Some get=17>
195
199
  # Option(nil) #=> #<Fear::None>
196
- # Some(17) #=> #<Fear::Some value=17>
197
- # None #=> #<Fear::None>
200
+ # Some(17) #=> #<Fear::Some get=17>
201
+ # None() #=> #<Fear::None>
198
202
  #
199
203
  module Mixin
200
- None = Fear::None
201
-
202
204
  # An +Option+ factory which creates +Some+ if the argument is
203
205
  # not +nil+, and +None+ if it is +nil+.
204
206
  # @param value [any]
205
- # @return [Some, None]
207
+ # @return [Fear::Some, Fear::None]
206
208
  #
207
209
  # @example
208
- # Option(v)
210
+ # Option(17) #=> #<Fear::Some get=17>
211
+ # Option(nil) #=> #<Fear::None>
209
212
  #
210
213
  def Option(value)
211
- if value.nil?
212
- None
213
- else
214
- Some(value)
215
- end
214
+ Fear.option(value)
216
215
  end
217
216
 
218
217
  # @return [None]
218
+ # @example
219
+ # None() #=> #<Fear::None>
220
+ #
219
221
  def None
220
- Fear::None
222
+ Fear.none
221
223
  end
222
224
 
223
225
  # @param value [any] except nil
224
- # @return [None]
226
+ # @return [Fear::Some]
227
+ # @example
228
+ # Some(17) #=> #<Fear::Some get=17>
229
+ # Some(nil) #=> #<Fear::Some get=nil>
230
+ #
225
231
  def Some(value)
226
- Some.new(value)
232
+ Fear.some(value)
227
233
  end
228
234
  end
229
235
  end
@@ -0,0 +1,38 @@
1
+ module Fear
2
+ module OptionApi
3
+ # An +Option+ factory which creates +Some+ if the argument is
4
+ # not +nil+, and +None+ if it is +nil+.
5
+ # @param value [any]
6
+ # @return [Fear::Some, Fear::None]
7
+ #
8
+ # @example
9
+ # Fear.option(nil) #=> #<Fear::None>
10
+ # Fear.option(17) #=> #<Fear::Some get=17>
11
+ #
12
+ def option(value)
13
+ if value.nil?
14
+ none
15
+ else
16
+ some(value)
17
+ end
18
+ end
19
+
20
+ # @return [Fear::None]
21
+ # @example
22
+ # Fear.none #=> #<Fear::None>
23
+ #
24
+ def none
25
+ Fear::None
26
+ end
27
+
28
+ # @param value [any]
29
+ # @return [Fear::Some]
30
+ # @example
31
+ # Fear.some(17) #=> #<Fear::Some get=17>
32
+ # Fear.some(nil) #=> #<Fear::Some get=nil>
33
+ #
34
+ def some(value)
35
+ Fear::Some.new(value)
36
+ end
37
+ end
38
+ end
@@ -35,6 +35,13 @@ module Fear
35
35
  # numbers = sample.map(is_even.or_else(is_odd).to_proc)
36
36
  #
37
37
  # @see https://github.com/scala/scala/commit/5050915eb620af3aa43d6ddaae6bbb83ad74900d
38
+ # @!method condition
39
+ # describes the domain of partial function
40
+ # @return [#===]
41
+ # @abstract
42
+ # @!method function
43
+ # @return [#call]
44
+ # @abstract
38
45
  module PartialFunction
39
46
  autoload :AndThen, 'fear/partial_function/and_then'
40
47
  autoload :Any, 'fear/partial_function/any'
@@ -44,16 +51,6 @@ module Fear
44
51
  autoload :Lifted, 'fear/partial_function/lifted'
45
52
  autoload :OrElse, 'fear/partial_function/or_else'
46
53
 
47
- # @param condition [#call] describes the domain of partial function
48
- # @param function [Proc] function definition
49
- def initialize(condition, &function)
50
- @condition = condition
51
- @function = function
52
- end
53
- attr_reader :condition, :function
54
- private :condition
55
- private :function
56
-
57
54
  # Checks if a value is contained in the function's domain.
58
55
  #
59
56
  # @param arg [any]
@@ -151,7 +148,7 @@ module Fear
151
148
  class << self
152
149
  # Creates partial function guarded by several condition.
153
150
  # All guards should match.
154
- # @param guards [<#===, symbol>]
151
+ # @param guards [<#===>]
155
152
  # @param function [Proc]
156
153
  # @return [Fear::PartialFunction]
157
154
  def and(*guards, &function)
@@ -160,7 +157,7 @@ module Fear
160
157
 
161
158
  # Creates partial function guarded by several condition.
162
159
  # Any condition should match.
163
- # @param guards [<#===, symbol>]
160
+ # @param guards [<#===>]
164
161
  # @param function [Proc]
165
162
  # @return [Fear::PartialFunction]
166
163
  def or(*guards, &function)
@@ -1,6 +1,6 @@
1
1
  module Fear
2
2
  module PartialFunction
3
- EMPTY = Object.new.extend(EmptyPartialFunction)
3
+ EMPTY = EmptyPartialFunction.new
4
4
  EMPTY.freeze
5
5
  end
6
6
  end
@@ -11,28 +11,21 @@ module Fear
11
11
  class << self
12
12
  # Optimized version for combination of two guardians
13
13
  # Two guarding is a very common situation. For example checking for Some, and checking
14
- # a value withing contianer.
14
+ # a value withing container.
15
15
  #
16
16
  def and2(c1, c2)
17
- Guard::And.new(
18
- (c1.is_a?(Symbol) ? c1.to_proc : c1),
19
- (c2.is_a?(Symbol) ? c2.to_proc : c2),
20
- )
17
+ Guard::And.new(c1, c2)
21
18
  end
22
19
 
23
20
  def and3(c1, c2, c3)
24
- Guard::And3.new(
25
- (c1.is_a?(Symbol) ? c1.to_proc : c1),
26
- (c2.is_a?(Symbol) ? c2.to_proc : c2),
27
- (c3.is_a?(Symbol) ? c3.to_proc : c3),
28
- )
21
+ Guard::And3.new(c1, c2, c3)
29
22
  end
30
23
 
31
24
  def and1(c)
32
- c.is_a?(Symbol) ? c.to_proc : c
25
+ c
33
26
  end
34
27
 
35
- # @param conditions [<#===, Symbol>]
28
+ # @param conditions [<#===>]
36
29
  # @return [Fear::PartialFunction::Guard]
37
30
  def and(conditions)
38
31
  case conditions.size
@@ -46,7 +39,7 @@ module Fear
46
39
  end
47
40
  end
48
41
 
49
- # @param conditions [<#===, Symbol>]
42
+ # @param conditions [<#===>]
50
43
  # @return [Fear::PartialFunction::Guard]
51
44
  def or(conditions)
52
45
  return Any if conditions.empty?
@@ -56,14 +49,9 @@ module Fear
56
49
  end
57
50
  end
58
51
 
59
- # @param condition [<#===, Symbol>]
52
+ # @param condition [#===]
60
53
  def initialize(condition)
61
- @condition =
62
- if condition.is_a?(Symbol)
63
- condition.to_proc
64
- else
65
- condition
66
- end
54
+ @condition = condition
67
55
  end
68
56
  attr_reader :condition
69
57
  private :condition