fear 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -60
  3. data/.travis.yml +8 -4
  4. data/CHANGELOG.md +7 -1
  5. data/Gemfile +5 -3
  6. data/Gemfile.lock +18 -20
  7. data/README.md +28 -14
  8. data/Rakefile +61 -60
  9. data/examples/pattern_extracting.rb +8 -6
  10. data/examples/pattern_matching_binary_tree_set.rb +4 -2
  11. data/examples/pattern_matching_number_in_words.rb +46 -42
  12. data/fear.gemspec +29 -27
  13. data/lib/fear.rb +44 -37
  14. data/lib/fear/await.rb +33 -0
  15. data/lib/fear/awaitable.rb +28 -0
  16. data/lib/fear/either.rb +2 -0
  17. data/lib/fear/either_api.rb +2 -0
  18. data/lib/fear/either_pattern_match.rb +2 -0
  19. data/lib/fear/empty_partial_function.rb +3 -1
  20. data/lib/fear/extractor.rb +30 -28
  21. data/lib/fear/extractor/anonymous_array_splat_matcher.rb +2 -0
  22. data/lib/fear/extractor/any_matcher.rb +2 -0
  23. data/lib/fear/extractor/array_head_matcher.rb +2 -0
  24. data/lib/fear/extractor/array_matcher.rb +2 -0
  25. data/lib/fear/extractor/array_splat_matcher.rb +2 -0
  26. data/lib/fear/extractor/empty_list_matcher.rb +2 -0
  27. data/lib/fear/extractor/extractor_matcher.rb +5 -3
  28. data/lib/fear/extractor/grammar.rb +5 -3
  29. data/lib/fear/extractor/identifier_matcher.rb +2 -0
  30. data/lib/fear/extractor/matcher.rb +5 -3
  31. data/lib/fear/extractor/matcher/and.rb +3 -1
  32. data/lib/fear/extractor/named_array_splat_matcher.rb +2 -0
  33. data/lib/fear/extractor/pattern.rb +7 -5
  34. data/lib/fear/extractor/typed_identifier_matcher.rb +2 -0
  35. data/lib/fear/extractor/value_matcher.rb +2 -0
  36. data/lib/fear/extractor_api.rb +2 -0
  37. data/lib/fear/failure.rb +2 -0
  38. data/lib/fear/failure_pattern_match.rb +2 -0
  39. data/lib/fear/for.rb +4 -2
  40. data/lib/fear/for_api.rb +3 -1
  41. data/lib/fear/future.rb +141 -64
  42. data/lib/fear/future_api.rb +2 -0
  43. data/lib/fear/left.rb +3 -1
  44. data/lib/fear/left_pattern_match.rb +2 -0
  45. data/lib/fear/none.rb +4 -2
  46. data/lib/fear/none_pattern_match.rb +2 -0
  47. data/lib/fear/option.rb +3 -1
  48. data/lib/fear/option_api.rb +2 -0
  49. data/lib/fear/option_pattern_match.rb +2 -0
  50. data/lib/fear/partial_function.rb +10 -8
  51. data/lib/fear/partial_function/and_then.rb +4 -2
  52. data/lib/fear/partial_function/any.rb +2 -0
  53. data/lib/fear/partial_function/combined.rb +3 -1
  54. data/lib/fear/partial_function/empty.rb +2 -0
  55. data/lib/fear/partial_function/guard.rb +7 -5
  56. data/lib/fear/partial_function/guard/and.rb +2 -0
  57. data/lib/fear/partial_function/guard/and3.rb +2 -0
  58. data/lib/fear/partial_function/guard/or.rb +2 -0
  59. data/lib/fear/partial_function/lifted.rb +2 -0
  60. data/lib/fear/partial_function/or_else.rb +3 -1
  61. data/lib/fear/partial_function_class.rb +3 -1
  62. data/lib/fear/pattern_match.rb +3 -1
  63. data/lib/fear/pattern_matching_api.rb +3 -1
  64. data/lib/fear/promise.rb +11 -3
  65. data/lib/fear/right.rb +3 -1
  66. data/lib/fear/right_biased.rb +4 -2
  67. data/lib/fear/right_pattern_match.rb +2 -0
  68. data/lib/fear/some.rb +2 -0
  69. data/lib/fear/some_pattern_match.rb +2 -0
  70. data/lib/fear/struct.rb +235 -0
  71. data/lib/fear/success.rb +2 -0
  72. data/lib/fear/success_pattern_match.rb +2 -0
  73. data/lib/fear/try.rb +2 -0
  74. data/lib/fear/try_api.rb +2 -0
  75. data/lib/fear/try_pattern_match.rb +2 -0
  76. data/lib/fear/unit.rb +6 -2
  77. data/lib/fear/utils.rb +4 -2
  78. data/lib/fear/version.rb +4 -1
  79. data/spec/fear/done_spec.rb +7 -5
  80. data/spec/fear/either/mixin_spec.rb +4 -2
  81. data/spec/fear/either_pattern_match_spec.rb +10 -8
  82. data/spec/fear/extractor/array_matcher_spec.rb +65 -63
  83. data/spec/fear/extractor/extractor_matcher_spec.rb +64 -62
  84. data/spec/fear/extractor/grammar_array_spec.rb +5 -3
  85. data/spec/fear/extractor/identified_matcher_spec.rb +18 -16
  86. data/spec/fear/extractor/identifier_matcher_spec.rb +26 -24
  87. data/spec/fear/extractor/pattern_spec.rb +17 -15
  88. data/spec/fear/extractor/typed_identifier_matcher_spec.rb +23 -21
  89. data/spec/fear/extractor/value_matcher_number_spec.rb +29 -27
  90. data/spec/fear/extractor/value_matcher_string_spec.rb +27 -25
  91. data/spec/fear/extractor/value_matcher_symbol_spec.rb +24 -22
  92. data/spec/fear/extractor_api_spec.rb +70 -68
  93. data/spec/fear/extractor_spec.rb +23 -21
  94. data/spec/fear/failure_spec.rb +59 -57
  95. data/spec/fear/for_spec.rb +19 -17
  96. data/spec/fear/future_spec.rb +456 -240
  97. data/spec/fear/guard_spec.rb +26 -24
  98. data/spec/fear/left_spec.rb +60 -58
  99. data/spec/fear/none_spec.rb +36 -34
  100. data/spec/fear/option/mixin_spec.rb +9 -7
  101. data/spec/fear/option_pattern_match_spec.rb +10 -8
  102. data/spec/fear/partial_function/empty_spec.rb +12 -10
  103. data/spec/fear/partial_function_and_then_spec.rb +39 -37
  104. data/spec/fear/partial_function_composition_spec.rb +46 -44
  105. data/spec/fear/partial_function_or_else_spec.rb +92 -90
  106. data/spec/fear/partial_function_spec.rb +46 -44
  107. data/spec/fear/pattern_match_spec.rb +31 -29
  108. data/spec/fear/promise_spec.rb +19 -17
  109. data/spec/fear/right_biased/left.rb +28 -26
  110. data/spec/fear/right_biased/right.rb +51 -49
  111. data/spec/fear/right_spec.rb +58 -56
  112. data/spec/fear/some_spec.rb +30 -28
  113. data/spec/fear/success_spec.rb +50 -48
  114. data/spec/fear/try/mixin_spec.rb +5 -3
  115. data/spec/fear/try_pattern_match_spec.rb +10 -8
  116. data/spec/fear/utils_spec.rb +16 -14
  117. data/spec/spec_helper.rb +7 -5
  118. data/spec/struct_spec.rb +226 -0
  119. metadata +18 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b04f2a97dbf830e68f70c42b703e2e70f7baf389da09871b2024effe95f51c68
4
- data.tar.gz: 7852518363fe60c10e9c60da873462e84e9b1ad567c760992bbf595b5eb388fb
3
+ metadata.gz: d67c81eee97a98c49a029602c26e6835f8bcf2875971619f173899a8986275ae
4
+ data.tar.gz: 345d18874fdfc360f72816757d5cb74acaa4291ee931c38fb19f82ea9cac3e6f
5
5
  SHA512:
6
- metadata.gz: 3b166826f4b02237d1614e334b98991271b8825d98cdb879d863abacdfc72587c0dfa47fe8762cab3b29cd7fa8472a5069092e1f8766e68807f8311bfe1c1614
7
- data.tar.gz: 8393f1845627f280e8e65caf2f4f36b329106beef35445ef58d3a8d053b8f2fb6644060a0139256bb7e120d4005efcb1427debbec495c97205719614361c73ab
6
+ metadata.gz: 3ae2c56f15d445dc73a56c11e1d035daacabdc4df85e4752fcf8500ce2ae7d3e9dd0aef9ae92a7f1e1a0560ead65e8ac774c4ffe7c6c251fa809fdf9b70cfda3
7
+ data.tar.gz: a0458d44ba7e29725f41285a9687f553b7c2227d99399c28e13502505a5b98844ab5ce31f423f20fdd2b1b015c42b56ea2f4b8bc1f3e01672a851f50ffe87b1f
@@ -1,63 +1,7 @@
1
- inherit_mode:
2
- merge:
3
- - Exclude
1
+ inherit_gem:
2
+ ruby_coding_standard: .rubocop.yml
4
3
 
5
4
  AllCops:
5
+ TargetRubyVersion: 2.4
6
6
  Exclude:
7
- - 'gemfiles/**/*'
8
- - 'vendor/bundle/'
9
-
10
- Layout/MultilineMethodCallIndentation:
11
- EnforcedStyle: indented
12
-
13
- Metrics/ClassLength:
14
- Enabled: false
15
-
16
- Naming/MethodName:
17
- Enabled: false
18
-
19
- Naming/UncommunicativeMethodParamName:
20
- Enabled: false
21
-
22
- Style/Documentation:
23
- Enabled: false
24
-
25
- Style/CaseEquality:
26
- Enabled: false
27
-
28
- Style/AccessModifierDeclarations:
29
- EnforcedStyle: inline
30
-
31
- Style/GuardClause:
32
- Enabled: false
33
-
34
- Style/IfUnlessModifier:
35
- Enabled: false
36
-
37
- Style/TrailingCommaInArguments:
38
- EnforcedStyleForMultiline: comma
39
-
40
- Style/TrailingCommaInArrayLiteral:
41
- EnforcedStyleForMultiline: comma
42
-
43
- Style/TrailingCommaInHashLiteral:
44
- EnforcedStyleForMultiline: comma
45
-
46
- Style/NumericPredicate:
47
- Enabled: false
48
-
49
- Style/CommentedKeyword:
50
- Enabled: false
51
-
52
- Layout/IndentHeredoc:
53
- Enabled: false
54
-
55
- Metrics/BlockLength:
56
- Exclude:
57
- - spec/**/*
58
- - Rakefile
59
- - fear.gemspec
60
- - examples/**/*
61
-
62
- Metrics/LineLength:
63
- Max: 120
7
+ - vendor/**/*
@@ -3,10 +3,14 @@ cache:
3
3
  bundler: true
4
4
  language: ruby
5
5
  rvm:
6
- - 2.4.5
7
- - 2.5.3
8
- - 2.6.1
9
- before_script:
6
+ - 2.4.6
7
+ - 2.5.5
8
+ - 2.6.3
9
+ before_install:
10
+ - rvm use @global
11
+ - gem uninstall bundler -x || true
12
+ - gem install bundler --force --version=2.0.1
13
+ - bundler --version
10
14
  - bundle install
11
15
  script:
12
16
  - bundle exec rspec
@@ -1,4 +1,10 @@
1
- ## 0.x
1
+ ## 1.1.0
2
+
3
+ * Add `Fear::Await.ready` and `Fear::Await.result`.
4
+ * Add callback versions with pattern matching `Fear::Future#on_success_match`, `#on_failure_match` and `#on_complete_match`.
5
+ * Implement immutable `Fear::Struct`
6
+
7
+ ## 1.0.0
2
8
 
3
9
  * Rename `Fear::Done` to `Fear::Unit` ([@bolshakov][])
4
10
  * Don't treat symbols as procs while pattern matching. See [#46](https://github.com/bolshakov/fear/pull/46) for motivation ([@bolshakov][])
data/Gemfile CHANGED
@@ -1,9 +1,11 @@
1
- source 'https://rubygems.org'
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in functional.gemspec
4
6
  gemspec
5
7
 
6
8
  # gem 'codeclimate-test-reporter', group: :test, require: nil
7
9
 
8
- gem 'irb'
9
- gem 'qo', github: 'baweaver/qo'
10
+ gem "irb"
11
+ gem "qo", github: "baweaver/qo"
@@ -8,7 +8,7 @@ GIT
8
8
  PATH
9
9
  remote: .
10
10
  specs:
11
- fear (1.0.0)
11
+ fear (1.1.0)
12
12
  lru_redux
13
13
  treetop
14
14
 
@@ -29,16 +29,14 @@ GEM
29
29
  dry-core (~> 0.4, >= 0.4.4)
30
30
  dry-equalizer
31
31
  irb (1.0.0)
32
- jaro_winkler (1.5.2)
32
+ jaro_winkler (1.5.3)
33
33
  lru_redux (1.1.0)
34
- parallel (1.14.0)
35
- parser (2.6.0.0)
34
+ parallel (1.17.0)
35
+ parser (2.6.3.0)
36
36
  ast (~> 2.4.0)
37
37
  polyglot (0.3.5)
38
- powerpack (0.1.2)
39
- psych (3.1.0)
40
38
  rainbow (3.0.0)
41
- rake (10.5.0)
39
+ rake (12.3.2)
42
40
  rspec (3.8.0)
43
41
  rspec-core (~> 3.8.0)
44
42
  rspec-expectations (~> 3.8.0)
@@ -52,22 +50,22 @@ GEM
52
50
  diff-lcs (>= 1.2.0, < 2.0)
53
51
  rspec-support (~> 3.8.0)
54
52
  rspec-support (3.8.0)
55
- rubocop (0.65.0)
53
+ rubocop (0.72.0)
56
54
  jaro_winkler (~> 1.5.1)
57
55
  parallel (~> 1.10)
58
- parser (>= 2.5, != 2.5.1.1)
59
- powerpack (~> 0.1)
60
- psych (>= 3.1.0)
56
+ parser (>= 2.6)
61
57
  rainbow (>= 2.2.2, < 4.0)
62
58
  ruby-progressbar (~> 1.7)
63
- unicode-display_width (~> 1.4.0)
64
- rubocop-rspec (1.32.0)
59
+ unicode-display_width (>= 1.4.0, < 1.7)
60
+ rubocop-rspec (1.33.0)
65
61
  rubocop (>= 0.60.0)
66
- ruby-progressbar (1.10.0)
62
+ ruby-progressbar (1.10.1)
63
+ ruby_coding_standard (0.1.0)
64
+ rubocop
67
65
  treetop (1.6.10)
68
66
  polyglot (~> 0.3)
69
- unicode-display_width (1.4.1)
70
- yard (0.9.18)
67
+ unicode-display_width (1.6.0)
68
+ yard (0.9.20)
71
69
 
72
70
  PLATFORMS
73
71
  ruby
@@ -81,11 +79,11 @@ DEPENDENCIES
81
79
  fear!
82
80
  irb
83
81
  qo!
84
- rake (~> 10.0)
82
+ rake (~> 12.3)
85
83
  rspec (~> 3.1)
86
- rubocop (= 0.65.0)
87
- rubocop-rspec (= 1.32.0)
84
+ rubocop-rspec (= 1.33.0)
85
+ ruby_coding_standard
88
86
  yard
89
87
 
90
88
  BUNDLED WITH
91
- 1.17.2
89
+ 2.0.1
data/README.md CHANGED
@@ -101,7 +101,7 @@ Fear.none.or_else { Fear.some(21) } #=> Fear.some(21)
101
101
  Fear.none.or_else { None } #=> None
102
102
  ```
103
103
 
104
- #### Option#inlude?
104
+ #### Option#include?
105
105
 
106
106
  Checks if `Option` has an element that is equal (as determined by `==`) to given values.
107
107
 
@@ -143,9 +143,9 @@ Fear.none.flat_map { |v| Fear.some(v/2) } #=> None
143
143
  Returns `false` if `None` or returns the result of the application of the given predicate to the `Some` value.
144
144
 
145
145
  ```ruby
146
- Fear.some(12).any?( |v| v > 10) #=> true
147
- Fear.some(7).any?( |v| v > 10) #=> false
148
- Fear.none.any?( |v| v > 10) #=> false
146
+ Fear.some(12).any? { |v| v > 10 } #=> true
147
+ Fear.some(7).any? { |v| v > 10 } #=> false
148
+ Fear.none.any? { |v| v > 10 } #=> false
149
149
  ```
150
150
 
151
151
  #### Option#select
@@ -300,9 +300,9 @@ Fear.failure(ArgumentError.new).to_option #=> None
300
300
  Returns `false` if `Failure` or returns the result of the application of the given predicate to the `Success` value.
301
301
 
302
302
  ```ruby
303
- Fear.success(12).any?( |v| v > 10) #=> true
304
- Fear.success(7).any?( |v| v > 10) #=> false
305
- Fear.failure(ArgumentError.new).any?( |v| v > 10) #=> false
303
+ Fear.success(12).any? { |v| v > 10 } #=> true
304
+ Fear.success(7).any? { |v| v > 10 } #=> false
305
+ Fear.failure(ArgumentError.new).any? { |v| v > 10 } #=> false
306
306
  ```
307
307
 
308
308
  #### Try#success? and Try#failure?
@@ -533,9 +533,9 @@ Fear.left('undefined').to_option #=> Fear::None
533
533
  Returns `false` if `Left` or returns the result of the application of the given predicate to the `Right` value.
534
534
 
535
535
  ```ruby
536
- Fear.right(12).any?( |v| v > 10) #=> true
537
- Fear.right(7).any?( |v| v > 10) #=> false
538
- Fear.left('undefined').any?( |v| v > 10) #=> false
536
+ Fear.right(12).any? { |v| v > 10 } #=> true
537
+ Fear.right(7).any? { |v| v > 10 } #=> false
538
+ Fear.left('undefined').any? { |v| v > 10 } #=> false
539
539
  ```
540
540
 
541
541
  #### Either#right?, Either#success?
@@ -764,7 +764,7 @@ end #=> returns new future of Fear.success(0)
764
764
 
765
765
  If the future resolved to success or recovery matcher did not matched, it returns the future `Fear::Failure`.
766
766
 
767
- The second option is `Future#fallbock_to` method. It allows to fallback to result of another future in case of failure
767
+ The second option is `Future#fallback_to` method. It allows to fallback to result of another future in case of failure
768
768
 
769
769
  ```ruby
770
770
  future = Fear.future { fail 'error' }
@@ -784,6 +784,20 @@ end.and_then do |m|
784
784
  end
785
785
  ```
786
786
 
787
+ #### Testing future values
788
+
789
+ Sometimes it may be helpful to await for future completion. You can await either future,
790
+ or result. Don't forget to pass timeout in seconds:
791
+
792
+
793
+ ```ruby
794
+ future = Fear.future { 42 }
795
+
796
+ Fear::Await.result(future, 3) #=> 42
797
+
798
+ Fear::Await.ready(future, 3) #=> Fear::Future.successful(42)
799
+ ```
800
+
787
801
  ### For composition ([API Documentation](http://www.rubydoc.info/github/bolshakov/fear/master/Fear/ForApi))
788
802
 
789
803
  Provides syntactic sugar for composition of multiple monadic operations.
@@ -1095,13 +1109,13 @@ factorial.(10) #=> 3628800
1095
1109
  Fibonacci number
1096
1110
 
1097
1111
  ```ruby
1098
- fibonnaci = Fear.matcher do |m|
1112
+ fibonacci = Fear.matcher do |m|
1099
1113
  m.case(0) { 0 }
1100
1114
  m.case(1) { 1 }
1101
- m.case(->(n) { n > 1}) { |n| fibonnaci.(n - 1) + fibonnaci.(n - 2) }
1115
+ m.case(->(n) { n > 1}) { |n| fibonacci.(n - 1) + fibonacci.(n - 2) }
1102
1116
  end
1103
1117
 
1104
- fibonnaci.(10) #=> 55
1118
+ fibonacci.(10) #=> 55
1105
1119
  ```
1106
1120
 
1107
1121
  Binary tree set implemented using pattern matching https://gist.github.com/bolshakov/3c51bbf7be95066d55d6d1ac8c605a1d
data/Rakefile CHANGED
@@ -1,28 +1,30 @@
1
- require 'bundler/gem_tasks'
2
- require 'benchmark/ips'
3
- require_relative 'lib/fear'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "benchmark/ips"
5
+ require_relative "lib/fear"
4
6
 
5
7
  namespace :perf do
6
8
  # Contains benchmarking against Dry-rb
7
9
  namespace :dry do
8
10
  task :some_fmap_vs_fear_some_map do
9
- require 'dry/monads/maybe'
11
+ require "dry/monads/maybe"
10
12
 
11
13
  dry = Dry::Monads::Some.new(42)
12
14
  fear = Fear.some(42)
13
15
 
14
16
  Benchmark.ips do |x|
15
- x.report('Dry') { dry.fmap(&:itself) }
17
+ x.report("Dry") { dry.fmap(&:itself) }
16
18
 
17
- x.report('Fear') { fear.map(&:itself) }
19
+ x.report("Fear") { fear.map(&:itself) }
18
20
 
19
21
  x.compare!
20
22
  end
21
23
  end
22
24
 
23
25
  task :do_vs_fear_for do
24
- require 'dry/monads/maybe'
25
- require 'dry/monads/do'
26
+ require "dry/monads/maybe"
27
+ require "dry/monads/do"
26
28
 
27
29
  class Operation
28
30
  include Dry::Monads::Maybe::Mixin
@@ -42,9 +44,9 @@ namespace :perf do
42
44
  op = Operation.new
43
45
 
44
46
  Benchmark.ips do |x|
45
- x.report('Dry') { op.call }
47
+ x.report("Dry") { op.() }
46
48
 
47
- x.report('Fear') do |_n|
49
+ x.report("Fear") do |_n|
48
50
  Fear.for(Fear.some(1), Fear.some(2)) do |one, two|
49
51
  one + two
50
52
  end
@@ -58,21 +60,21 @@ namespace :perf do
58
60
  # Contains internal benchmarking to if optimization works
59
61
  namespace :fear do
60
62
  task :fear_pattern_extracting_with_vs_without_cache do
61
- some = Fear.some([:err, 'not found'])
63
+ some = Fear.some([:err, "not found"])
62
64
 
63
65
  class WOCache < Fear::Extractor::Pattern
64
66
  def initialize(pattern)
65
67
  @matcher = compile_pattern_without_cache(pattern)
66
68
  end
67
69
  end
68
- pattern = 'Fear::Some([:err, code])'
70
+ pattern = "Fear::Some([:err, code])"
69
71
 
70
72
  Benchmark.ips do |x|
71
- x.report('With cache') do |_n|
73
+ x.report("With cache") do |_n|
72
74
  Fear::Extractor::Pattern.new(pattern).extracted_arguments(some)
73
75
  end
74
76
 
75
- x.report('Without cache') do |_n|
77
+ x.report("Without cache") do |_n|
76
78
  WOCache.new(pattern).extracted_arguments(some)
77
79
  end
78
80
 
@@ -85,11 +87,11 @@ namespace :perf do
85
87
  condition = Integer
86
88
 
87
89
  Benchmark.ips do |x|
88
- x.report('Guard.new') do |n|
90
+ x.report("Guard.new") do |n|
89
91
  Fear::PartialFunction::Guard.new(condition) === n
90
92
  end
91
93
 
92
- x.report('Guard.and1') do |n|
94
+ x.report("Guard.and1") do |n|
93
95
  Fear::PartialFunction::Guard.and1(condition) === n
94
96
  end
95
97
 
@@ -105,11 +107,11 @@ namespace :perf do
105
107
  and_and = Fear::PartialFunction::Guard.new(first).and(Fear::PartialFunction::Guard.new(second))
106
108
 
107
109
  Benchmark.ips do |x|
108
- x.report('and2') do |n|
110
+ x.report("and2") do |n|
109
111
  and2 === n
110
112
  end
111
113
 
112
- x.report('Guard#and') do |n|
114
+ x.report("Guard#and") do |n|
113
115
  and_and === n
114
116
  end
115
117
 
@@ -120,7 +122,7 @@ namespace :perf do
120
122
  task :and3_vs_and_and do
121
123
  first = Integer
122
124
  second = ->(x) { x > 2 }
123
- third = ->(x) { x < 10 }
125
+ third = ->(x) { x < 10 }
124
126
 
125
127
  and3 = Fear::PartialFunction::Guard.and3(first, second, third)
126
128
 
@@ -129,11 +131,11 @@ namespace :perf do
129
131
  .and(Fear::PartialFunction::Guard.new(third))
130
132
 
131
133
  Benchmark.ips do |x|
132
- x.report('Guard.and3') do |n|
134
+ x.report("Guard.and3") do |n|
133
135
  and3 === n
134
136
  end
135
137
 
136
- x.report('Guard#and') do |n|
138
+ x.report("Guard#and") do |n|
137
139
  and_and_and === n
138
140
  end
139
141
 
@@ -149,15 +151,15 @@ namespace :perf do
149
151
  end
150
152
 
151
153
  Benchmark.ips do |x|
152
- x.report('construction') do
154
+ x.report("construction") do
153
155
  Fear::PatternMatch.new do |m|
154
156
  m.case(Integer) { |y| y * 2 }
155
157
  m.case(String) { |y| y.to_i(10) * 2 }
156
158
  end
157
159
  end
158
160
 
159
- x.report('execution') do
160
- matcher.call(42)
161
+ x.report("execution") do
162
+ matcher.(42)
161
163
  end
162
164
 
163
165
  x.compare!
@@ -166,23 +168,23 @@ namespace :perf do
166
168
  end
167
169
 
168
170
  namespace :pattern_matching do
169
- require 'qo'
170
- require 'dry/matcher'
171
+ require "qo"
172
+ require "dry/matcher"
171
173
 
172
174
  task :qo_vs_fear_pattern_extraction do
173
175
  User = Struct.new(:id, :name)
174
- user = User.new(42, 'Jane')
176
+ user = User.new(42, "Jane")
175
177
 
176
178
  Benchmark.ips do |x|
177
- x.report('Qo') do
179
+ x.report("Qo") do
178
180
  Qo.case(user, destructure: true) do |m|
179
181
  m.when(User) { |id, name| [id, name] }
180
182
  end
181
183
  end
182
184
 
183
- x.report('Fear') do
185
+ x.report("Fear") do
184
186
  Fear.match(user) do |m|
185
- m.xcase('User(id, name)') { |id:, name:| [id, name] }
187
+ m.xcase("User(id, name)") { |id:, name:| [id, name] }
186
188
  end
187
189
  end
188
190
 
@@ -198,25 +200,24 @@ namespace :perf do
198
200
  end
199
201
  end
200
202
 
201
- SuccessBranch = Qo.create_branch(name: 'success', precondition: Fear::Success, extractor: :get)
202
- FailureBranch = Qo.create_branch(name: 'failure', precondition: Fear::Failure, extractor: :exception)
203
+ SuccessBranch = Qo.create_branch(name: "success", precondition: Fear::Success, extractor: :get)
204
+ FailureBranch = Qo.create_branch(name: "failure", precondition: Fear::Failure, extractor: :exception)
203
205
 
204
206
  PatternMatch = Qo.create_pattern_match(
205
- branches: [SuccessBranch,
206
- FailureBranch],
207
+ branches: [SuccessBranch, FailureBranch],
207
208
  ).prepend(ExhaustivePatternMatch)
208
209
 
209
210
  Fear::Success.include(PatternMatch.mixin(as: :qo_match))
210
211
 
211
212
  success_case = Dry::Matcher::Case.new(
212
- match: lambda { |try, *pattern|
213
+ match: ->(try, *pattern) {
213
214
  try.is_a?(Fear::Success) && pattern.all? { |p| p === try.get }
214
215
  },
215
216
  resolve: ->(try) { try.get },
216
217
  )
217
218
 
218
219
  failure_case = Dry::Matcher::Case.new(
219
- match: lambda { |try, *pattern|
220
+ match: ->(try, *pattern) {
220
221
  try.is_a?(Fear::Failure) && pattern.all? { |p| p === try.exception }
221
222
  },
222
223
  resolve: ->(value) { value.exception },
@@ -228,27 +229,27 @@ namespace :perf do
228
229
  success = Fear::Success.new(4)
229
230
 
230
231
  Benchmark.ips do |x|
231
- x.report('Qo') do
232
+ x.report("Qo") do
232
233
  success.qo_match do |m|
233
234
  m.failure(&:itself)
234
235
  m.success(Integer, ->(y) { y % 5 == 0 }, &:itself)
235
- m.success { 'else' }
236
+ m.success { "else" }
236
237
  end
237
238
  end
238
239
 
239
- x.report('Fear') do
240
+ x.report("Fear") do
240
241
  success.match do |m|
241
242
  m.failure(&:itself)
242
243
  m.success(Integer, ->(y) { y % 5 == 0 }, &:itself)
243
- m.success { 'else' }
244
+ m.success { "else" }
244
245
  end
245
246
  end
246
247
 
247
- x.report('Dr::Matcher') do
248
- matcher.call(success) do |m|
248
+ x.report("Dr::Matcher") do
249
+ matcher.(success) do |m|
249
250
  m.failure(&:itself)
250
251
  m.success(Integer, ->(y) { y % 5 == 0 }, &:itself)
251
- m.success { 'else' }
252
+ m.success { "else" }
252
253
  end
253
254
  end
254
255
 
@@ -264,8 +265,8 @@ namespace :perf do
264
265
  end
265
266
  end
266
267
 
267
- SuccessBranch = Qo.create_branch(name: 'success', precondition: Fear::Success, extractor: :get)
268
- FailureBranch = Qo.create_branch(name: 'failure', precondition: Fear::Failure, extractor: :exception)
268
+ SuccessBranch = Qo.create_branch(name: "success", precondition: Fear::Success, extractor: :get)
269
+ FailureBranch = Qo.create_branch(name: "failure", precondition: Fear::Failure, extractor: :exception)
269
270
 
270
271
  QoPatternMatch = Qo.create_pattern_match(
271
272
  branches: [SuccessBranch, FailureBranch],
@@ -278,22 +279,22 @@ namespace :perf do
278
279
  qo_matcher = QoPatternMatch.new do |m|
279
280
  m.success(1, &:itself)
280
281
  m.success(4, &:itself)
281
- m.failure { 'failure' }
282
+ m.failure { "failure" }
282
283
  end
283
284
 
284
285
  fear_matcher = Fear::TryPatternMatch.new do |m|
285
286
  m.success(1, &:itself)
286
287
  m.success(4, &:itself)
287
- m.failure { 'failure' }
288
+ m.failure { "failure" }
288
289
  end
289
290
 
290
291
  Benchmark.ips do |x|
291
- x.report('Qo') do
292
- qo_matcher.call(success)
292
+ x.report("Qo") do
293
+ qo_matcher.(success)
293
294
  end
294
295
 
295
- x.report('Fear') do
296
- fear_matcher.call(success)
296
+ x.report("Fear") do
297
+ fear_matcher.(success)
297
298
  end
298
299
 
299
300
  x.compare!
@@ -305,33 +306,33 @@ namespace :perf do
305
306
  if n <= 1
306
307
  1
307
308
  else
308
- n * factorial_proc.call(n - 1)
309
+ n * factorial_proc.(n - 1)
309
310
  end
310
311
  end
311
312
 
312
313
  factorial_pm = Fear.matcher do |m|
313
314
  m.case(1, &:itself)
314
315
  m.case(0, &:itself)
315
- m.else { |n| n * factorial_pm.call(n - 1) }
316
+ m.else { |n| n * factorial_pm.(n - 1) }
316
317
  end
317
318
 
318
319
  factorial_qo = Qo.match do |m|
319
320
  m.when(1, &:itself)
320
321
  m.when(0, &:itself)
321
- m.else { |n| n * factorial_qo.call(n - 1) }
322
+ m.else { |n| n * factorial_qo.(n - 1) }
322
323
  end
323
324
 
324
325
  Benchmark.ips do |x|
325
- x.report('Proc') do
326
- factorial_proc.call(100)
326
+ x.report("Proc") do
327
+ factorial_proc.(100)
327
328
  end
328
329
 
329
- x.report('Fear') do
330
- factorial_pm.call(100)
330
+ x.report("Fear") do
331
+ factorial_pm.(100)
331
332
  end
332
333
 
333
- x.report('Qo') do
334
- factorial_qo.call(100)
334
+ x.report("Qo") do
335
+ factorial_qo.(100)
335
336
  end
336
337
 
337
338
  x.compare!