fear 0.9.0 → 1.2.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 +5 -5
- data/.github/workflows/rubocop.yml +39 -0
- data/.github/workflows/spec.yml +42 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +4 -12
- data/.simplecov +17 -0
- data/CHANGELOG.md +40 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +130 -0
- data/LICENSE.txt +1 -1
- data/README.md +1293 -97
- data/Rakefile +369 -1
- data/benchmarks/README.md +1 -0
- data/benchmarks/dry_do_vs_fear_for.txt +11 -0
- data/benchmarks/dry_some_fmap_vs_fear_some_map.txt +11 -0
- data/benchmarks/factorial.txt +16 -0
- data/benchmarks/fear_gaurd_and1_vs_new.txt +13 -0
- data/benchmarks/fear_gaurd_and2_vs_and.txt +13 -0
- data/benchmarks/fear_gaurd_and3_vs_and_and.txt +13 -0
- data/benchmarks/fear_pattern_extracting_with_vs_without_cache.txt +11 -0
- data/benchmarks/fear_pattern_matching_construction_vs_execution.txt +13 -0
- data/benchmarks/pattern_matching_dry_vs_qo_vs_fear_try.txt +14 -0
- data/benchmarks/pattern_matching_qo_vs_fear_pattern_extraction.txt +11 -0
- data/benchmarks/pattern_matching_qo_vs_fear_try_execution.txt +11 -0
- data/examples/pattern_extracting.rb +17 -0
- data/examples/pattern_extracting_ruby2.7.rb +15 -0
- data/examples/pattern_matching_binary_tree_set.rb +101 -0
- data/examples/pattern_matching_number_in_words.rb +60 -0
- data/fear.gemspec +34 -23
- data/lib/dry/types/fear.rb +8 -0
- data/lib/dry/types/fear/option.rb +125 -0
- data/lib/fear.rb +65 -15
- data/lib/fear/await.rb +33 -0
- data/lib/fear/awaitable.rb +28 -0
- data/lib/fear/either.rb +131 -71
- data/lib/fear/either_api.rb +23 -0
- data/lib/fear/either_pattern_match.rb +53 -0
- data/lib/fear/empty_partial_function.rb +38 -0
- data/lib/fear/extractor.rb +112 -0
- data/lib/fear/extractor/anonymous_array_splat_matcher.rb +10 -0
- data/lib/fear/extractor/any_matcher.rb +17 -0
- data/lib/fear/extractor/array_head_matcher.rb +36 -0
- data/lib/fear/extractor/array_matcher.rb +40 -0
- data/lib/fear/extractor/array_splat_matcher.rb +16 -0
- data/lib/fear/extractor/empty_list_matcher.rb +20 -0
- data/lib/fear/extractor/extractor_matcher.rb +44 -0
- data/lib/fear/extractor/grammar.rb +203 -0
- data/lib/fear/extractor/grammar.treetop +129 -0
- data/lib/fear/extractor/identifier_matcher.rb +18 -0
- data/lib/fear/extractor/matcher.rb +53 -0
- data/lib/fear/extractor/matcher/and.rb +38 -0
- data/lib/fear/extractor/named_array_splat_matcher.rb +17 -0
- data/lib/fear/extractor/pattern.rb +58 -0
- data/lib/fear/extractor/typed_identifier_matcher.rb +26 -0
- data/lib/fear/extractor/value_matcher.rb +19 -0
- data/lib/fear/extractor_api.rb +35 -0
- data/lib/fear/failure.rb +46 -14
- data/lib/fear/failure_pattern_match.rb +10 -0
- data/lib/fear/for.rb +37 -95
- data/lib/fear/for_api.rb +68 -0
- data/lib/fear/future.rb +497 -0
- data/lib/fear/future_api.rb +21 -0
- data/lib/fear/left.rb +19 -2
- data/lib/fear/left_pattern_match.rb +11 -0
- data/lib/fear/none.rb +67 -3
- data/lib/fear/none_pattern_match.rb +14 -0
- data/lib/fear/option.rb +120 -56
- data/lib/fear/option_api.rb +40 -0
- data/lib/fear/option_pattern_match.rb +48 -0
- data/lib/fear/partial_function.rb +176 -0
- data/lib/fear/partial_function/and_then.rb +50 -0
- data/lib/fear/partial_function/any.rb +28 -0
- data/lib/fear/partial_function/combined.rb +53 -0
- data/lib/fear/partial_function/empty.rb +10 -0
- data/lib/fear/partial_function/guard.rb +80 -0
- data/lib/fear/partial_function/guard/and.rb +38 -0
- data/lib/fear/partial_function/guard/and3.rb +41 -0
- data/lib/fear/partial_function/guard/or.rb +38 -0
- data/lib/fear/partial_function/lifted.rb +23 -0
- data/lib/fear/partial_function/or_else.rb +64 -0
- data/lib/fear/partial_function_class.rb +38 -0
- data/lib/fear/pattern_match.rb +114 -0
- data/lib/fear/pattern_matching_api.rb +137 -0
- data/lib/fear/promise.rb +95 -0
- data/lib/fear/right.rb +20 -2
- data/lib/fear/right_biased.rb +6 -14
- data/lib/fear/right_pattern_match.rb +11 -0
- data/lib/fear/some.rb +55 -3
- data/lib/fear/some_pattern_match.rb +13 -0
- data/lib/fear/struct.rb +248 -0
- data/lib/fear/success.rb +35 -5
- data/lib/fear/success_pattern_match.rb +12 -0
- data/lib/fear/try.rb +136 -79
- data/lib/fear/try_api.rb +33 -0
- data/lib/fear/try_pattern_match.rb +33 -0
- data/lib/fear/unit.rb +32 -0
- data/lib/fear/utils.rb +39 -14
- data/lib/fear/version.rb +4 -1
- data/spec/dry/types/fear/option/constrained_spec.rb +22 -0
- data/spec/dry/types/fear/option/core_spec.rb +77 -0
- data/spec/dry/types/fear/option/default_spec.rb +21 -0
- data/spec/dry/types/fear/option/hash_spec.rb +58 -0
- data/spec/dry/types/fear/option/option_spec.rb +97 -0
- data/spec/fear/awaitable_spec.rb +17 -0
- data/spec/fear/done_spec.rb +8 -6
- data/spec/fear/either/mixin_spec.rb +17 -0
- data/spec/fear/either_pattern_match_spec.rb +37 -0
- data/spec/fear/either_pattern_matching_spec.rb +28 -0
- data/spec/fear/extractor/array_matcher_spec.rb +230 -0
- data/spec/fear/extractor/extractor_matcher_spec.rb +153 -0
- data/spec/fear/extractor/grammar_array_spec.rb +25 -0
- data/spec/fear/extractor/identified_matcher_spec.rb +49 -0
- data/spec/fear/extractor/identifier_matcher_spec.rb +68 -0
- data/spec/fear/extractor/pattern_spec.rb +34 -0
- data/spec/fear/extractor/typed_identifier_matcher_spec.rb +64 -0
- data/spec/fear/extractor/value_matcher_number_spec.rb +79 -0
- data/spec/fear/extractor/value_matcher_string_spec.rb +88 -0
- data/spec/fear/extractor/value_matcher_symbol_spec.rb +71 -0
- data/spec/fear/extractor_api_spec.rb +115 -0
- data/spec/fear/extractor_spec.rb +61 -0
- data/spec/fear/failure_spec.rb +145 -45
- data/spec/fear/for_spec.rb +57 -67
- data/spec/fear/future_spec.rb +691 -0
- data/spec/fear/guard_spec.rb +103 -0
- data/spec/fear/left_spec.rb +112 -46
- data/spec/fear/none_spec.rb +114 -16
- data/spec/fear/option/mixin_spec.rb +39 -0
- data/spec/fear/option_pattern_match_spec.rb +35 -0
- data/spec/fear/option_pattern_matching_spec.rb +34 -0
- data/spec/fear/option_spec.rb +121 -8
- data/spec/fear/partial_function/empty_spec.rb +38 -0
- data/spec/fear/partial_function_and_then_spec.rb +147 -0
- data/spec/fear/partial_function_composition_spec.rb +82 -0
- data/spec/fear/partial_function_or_else_spec.rb +276 -0
- data/spec/fear/partial_function_spec.rb +239 -0
- data/spec/fear/pattern_match_spec.rb +93 -0
- data/spec/fear/pattern_matching_api_spec.rb +31 -0
- data/spec/fear/promise_spec.rb +96 -0
- data/spec/fear/right_biased/left.rb +29 -32
- data/spec/fear/right_biased/right.rb +51 -54
- data/spec/fear/right_spec.rb +109 -41
- data/spec/fear/some_spec.rb +80 -15
- data/spec/fear/success_spec.rb +99 -32
- data/spec/fear/try/mixin_spec.rb +19 -0
- data/spec/fear/try_pattern_match_spec.rb +37 -0
- data/spec/fear/try_pattern_matching_spec.rb +34 -0
- data/spec/fear/utils_spec.rb +16 -14
- data/spec/spec_helper.rb +13 -7
- data/spec/struct_pattern_matching_spec.rb +36 -0
- data/spec/struct_spec.rb +226 -0
- data/spec/support/dry_types.rb +6 -0
- metadata +320 -29
- data/.travis.yml +0 -9
- data/lib/fear/done.rb +0 -22
- data/lib/fear/for/evaluation_context.rb +0 -91
data/.travis.yml
DELETED
data/lib/fear/done.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
module Fear
|
2
|
-
# Typically used to signal completion but there is no actual value completed.
|
3
|
-
#
|
4
|
-
# @example
|
5
|
-
# if user.valid?
|
6
|
-
# Right(Done)
|
7
|
-
# else
|
8
|
-
# Left(user.errors)
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
Done = Object.new.tap do |done|
|
12
|
-
# @return [String]
|
13
|
-
def done.to_s
|
14
|
-
'Done'
|
15
|
-
end
|
16
|
-
|
17
|
-
# @return [String]
|
18
|
-
def done.inspect
|
19
|
-
'Done'
|
20
|
-
end
|
21
|
-
end.freeze
|
22
|
-
end
|
@@ -1,91 +0,0 @@
|
|
1
|
-
module Fear
|
2
|
-
# This class provides syntactic sugar for composition of
|
3
|
-
# multiple monadic operations. It supports two such
|
4
|
-
# operations - +flat_map+ and +map+. Any class providing them
|
5
|
-
# is supported by +For+.
|
6
|
-
#
|
7
|
-
# For(a: Some(2), b: Some(3)) { a * b } #=> Some(6)
|
8
|
-
#
|
9
|
-
# If one of operands is None, the result is None
|
10
|
-
#
|
11
|
-
# For(a: Some(2), b: None()) { a * b } #=> None()
|
12
|
-
# For(a: None(), b: Some(2)) { a * b } #=> None()
|
13
|
-
#
|
14
|
-
# Lets look at first example:
|
15
|
-
#
|
16
|
-
# For(a: Some(2), b: Some(3)) { a * b }
|
17
|
-
#
|
18
|
-
# would be translated to:
|
19
|
-
#
|
20
|
-
# Some(2).flat_map do |a|
|
21
|
-
# Some(3).map do |b|
|
22
|
-
# a * b
|
23
|
-
# end
|
24
|
-
# end
|
25
|
-
#
|
26
|
-
# It works with arrays as well
|
27
|
-
#
|
28
|
-
# For(a: [1, 2], b: [2, 3], c: [3, 4]) { a * b * c }
|
29
|
-
# #=> [6, 8, 9, 12, 12, 16, 18, 24]
|
30
|
-
#
|
31
|
-
# would be translated to:
|
32
|
-
#
|
33
|
-
# [1, 2].flat_map do |a|
|
34
|
-
# [2, 3].flat_map do |b|
|
35
|
-
# [3, 4].map do |c|
|
36
|
-
# a * b * c
|
37
|
-
# end
|
38
|
-
# end
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# If you pass lambda as a variable value, it would be evaluated
|
42
|
-
# only on demand.
|
43
|
-
#
|
44
|
-
# For(a: -> { None() }, b: -> { fail 'kaboom' } ) { a * b }
|
45
|
-
# #=> None()
|
46
|
-
#
|
47
|
-
# It does not fail since `b` is not evaluated.
|
48
|
-
# You can mix and match lambdas and variables.
|
49
|
-
#
|
50
|
-
# For(a: -> None(), b: -> { fail 'kaboom' } ) { a * b }
|
51
|
-
# #=> None()
|
52
|
-
#
|
53
|
-
class For
|
54
|
-
# Context of block evaluation. It respond to passed locals.
|
55
|
-
#
|
56
|
-
# @example
|
57
|
-
# context = EvaluationContext.new
|
58
|
-
# context.assign(:foo, 'bar')
|
59
|
-
# context.foo #=> 'bar'
|
60
|
-
#
|
61
|
-
class EvaluationContext < BasicObject
|
62
|
-
include ::Fear::Option::Mixin
|
63
|
-
include ::Fear::Either::Mixin
|
64
|
-
include ::Fear::Try::Mixin
|
65
|
-
|
66
|
-
def initialize(outer_context)
|
67
|
-
@assigns = {}
|
68
|
-
@outer_context = outer_context
|
69
|
-
end
|
70
|
-
|
71
|
-
def __assign__(name, value)
|
72
|
-
@assigns[name] = value
|
73
|
-
end
|
74
|
-
|
75
|
-
def method_missing(name, *args, &block)
|
76
|
-
if @assigns.include?(name) && args.empty? && block.nil?
|
77
|
-
@assigns[name]
|
78
|
-
elsif @outer_context.respond_to?(name, true)
|
79
|
-
@outer_context.__send__(name, *args, &block)
|
80
|
-
else
|
81
|
-
super
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def respond_to_missing?(name, _)
|
86
|
-
@assigns.key?(name) && args.empty? && block.nil?
|
87
|
-
end
|
88
|
-
end
|
89
|
-
private_constant(:EvaluationContext)
|
90
|
-
end
|
91
|
-
end
|