fear 1.0.0 → 1.1.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 (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
@@ -1,149 +1,151 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::Extractor::ExtractorMatcher do
2
4
  let(:parser) { Fear::Extractor::GrammarParser.new }
3
5
  let(:matcher) { parser.parse(pattern).to_matcher }
4
6
 
5
- describe '#defined_at?' do
7
+ describe "#defined_at?" do
6
8
  subject { matcher }
7
9
 
8
- context 'boolean extractor' do
9
- let(:pattern) { 'IsEven()' }
10
+ context "boolean extractor" do
11
+ let(:pattern) { "IsEven()" }
10
12
 
11
13
  it { is_expected.to be_defined_at(42) }
12
14
  it { is_expected.not_to be_defined_at(43) }
13
- it { is_expected.not_to be_defined_at('foo') }
15
+ it { is_expected.not_to be_defined_at("foo") }
14
16
  end
15
17
 
16
- context 'single argument extractor' do
17
- let(:pattern) { 'Fear::Some(a : Integer)' }
18
+ context "single argument extractor" do
19
+ let(:pattern) { "Fear::Some(a : Integer)" }
18
20
 
19
21
  it { is_expected.to be_defined_at(Fear.some(42)) }
20
- it { is_expected.not_to be_defined_at('foo') }
21
- it { is_expected.not_to be_defined_at(Fear.some('foo')) }
22
+ it { is_expected.not_to be_defined_at("foo") }
23
+ it { is_expected.not_to be_defined_at(Fear.some("foo")) }
22
24
  end
23
25
 
24
- context 'single argument extractor with array as an argument' do
25
- let(:pattern) { 'Fear::Some([1, 2])' }
26
+ context "single argument extractor with array as an argument" do
27
+ let(:pattern) { "Fear::Some([1, 2])" }
26
28
 
27
29
  it { is_expected.to be_defined_at(Fear.some([1, 2])) }
28
30
  it { is_expected.not_to be_defined_at(Fear.some([1, 1])) }
29
- it { is_expected.not_to be_defined_at(Fear.some('foo')) }
31
+ it { is_expected.not_to be_defined_at(Fear.some("foo")) }
30
32
  end
31
33
 
32
- context 'multiple arguments extractor' do
33
- let(:pattern) { 'Date(2017, month, _)' }
34
+ context "multiple arguments extractor" do
35
+ let(:pattern) { "Date(2017, month, _)" }
34
36
 
35
- it { is_expected.to be_defined_at(Date.parse('2017-02-15')) }
36
- it { is_expected.not_to be_defined_at(Date.parse('2018-02-15')) }
37
- it { is_expected.not_to be_defined_at('foo') }
37
+ it { is_expected.to be_defined_at(Date.parse("2017-02-15")) }
38
+ it { is_expected.not_to be_defined_at(Date.parse("2018-02-15")) }
39
+ it { is_expected.not_to be_defined_at("foo") }
38
40
  end
39
41
 
40
- context 'Struct' do
41
- StructDate = Struct.new(:year, :month, :day)
42
+ context "Struct" do
43
+ StructDate = ::Struct.new(:year, :month, :day)
42
44
 
43
- let(:pattern) { 'StructDate(2017, month, _)' }
45
+ let(:pattern) { "StructDate(2017, month, _)" }
44
46
 
45
47
  it { is_expected.to be_defined_at(StructDate.new(2017, 2, 15)) }
46
48
  it { is_expected.not_to be_defined_at(StructDate.new(2018, 2, 15)) }
47
49
  end
48
50
  end
49
51
 
50
- describe '#call' do
51
- subject { matcher.call(other) }
52
+ describe "#call" do
53
+ subject { matcher.(other) }
52
54
 
53
- context 'single argument extractor' do
54
- let(:pattern) { 'Fear::Some(a : Integer)' }
55
+ context "single argument extractor" do
56
+ let(:pattern) { "Fear::Some(a : Integer)" }
55
57
  let(:other) { Fear.some(42) }
56
58
 
57
59
  it { is_expected.to eq(a: 42) }
58
60
  end
59
61
 
60
- context 'multiple arguments extractor' do
61
- let(:pattern) { 'Date(2017, month, day)' }
62
- let(:other) { Date.parse('2017-02-15') }
62
+ context "multiple arguments extractor" do
63
+ let(:pattern) { "Date(2017, month, day)" }
64
+ let(:other) { Date.parse("2017-02-15") }
63
65
 
64
66
  it { is_expected.to eq(month: 2, day: 15) }
65
67
  end
66
68
  end
67
69
 
68
- describe '#failure_reason' do
70
+ describe "#failure_reason" do
69
71
  subject { matcher.failure_reason(other) }
70
72
 
71
- context 'no argument extractor' do
72
- let(:pattern) { 'IsEven()' }
73
+ context "no argument extractor" do
74
+ let(:pattern) { "IsEven()" }
73
75
 
74
- context 'defined' do
76
+ context "defined" do
75
77
  let(:other) { 42 }
76
78
 
77
79
  it { is_expected.to eq(Fear.none) }
78
80
  end
79
81
 
80
- context 'not defined' do
82
+ context "not defined" do
81
83
  let(:other) { 43 }
82
84
 
83
- it { is_expected.to eq(Fear.some(<<-MSG.strip)) }
84
- Expected `43` to match:
85
- IsEven()
86
- ^
85
+ it { is_expected.to eq(Fear.some(<<~MSG.strip)) }
86
+ Expected `43` to match:
87
+ IsEven()
88
+ ^
87
89
  MSG
88
90
  end
89
91
  end
90
92
 
91
- context 'single argument extractor' do
92
- let(:pattern) { 'Fear::Some(a : Integer)' }
93
+ context "single argument extractor" do
94
+ let(:pattern) { "Fear::Some(a : Integer)" }
93
95
 
94
- context 'defined' do
96
+ context "defined" do
95
97
  let(:other) { Fear.some(42) }
96
98
 
97
99
  it { is_expected.to eq(Fear.none) }
98
100
  end
99
101
 
100
- context 'not defined' do
101
- let(:other) { Fear.some('42') }
102
+ context "not defined" do
103
+ let(:other) { Fear.some("42") }
102
104
 
103
- it { is_expected.to eq(Fear.some(<<-MSG.strip)) }
104
- Expected `"42"` to match:
105
- Fear::Some(a : Integer)
106
- ~~~~~~~~~~~~~~~^
105
+ it { is_expected.to eq(Fear.some(<<~MSG.strip)) }
106
+ Expected `"42"` to match:
107
+ Fear::Some(a : Integer)
108
+ ~~~~~~~~~~~~~~~^
107
109
  MSG
108
110
  end
109
111
  end
110
112
 
111
- context 'single argument extractor, array argument' do
112
- let(:pattern) { 'Fear::Some([1, 2])' }
113
+ context "single argument extractor, array argument" do
114
+ let(:pattern) { "Fear::Some([1, 2])" }
113
115
 
114
- context 'defined' do
116
+ context "defined" do
115
117
  let(:other) { Fear.some([1, 2]) }
116
118
 
117
119
  it { is_expected.to eq(Fear.none) }
118
120
  end
119
121
 
120
- context 'not defined' do
122
+ context "not defined" do
121
123
  let(:other) { Fear.some([1, 1]) }
122
124
 
123
- it { is_expected.to eq(Fear.some(<<-MSG.strip)) }
124
- Expected `1` to match:
125
- Fear::Some([1, 2])
126
- ~~~~~~~~~~~~~~~^
125
+ it { is_expected.to eq(Fear.some(<<~MSG.strip)) }
126
+ Expected `1` to match:
127
+ Fear::Some([1, 2])
128
+ ~~~~~~~~~~~~~~~^
127
129
  MSG
128
130
  end
129
131
  end
130
132
 
131
- context 'multiple arguments extractor' do
132
- let(:pattern) { 'Date(year, 02, day)' }
133
+ context "multiple arguments extractor" do
134
+ let(:pattern) { "Date(year, 02, day)" }
133
135
 
134
- context 'defined' do
135
- let(:other) { Date.parse('2017-02-15') }
136
+ context "defined" do
137
+ let(:other) { Date.parse("2017-02-15") }
136
138
 
137
139
  it { is_expected.to eq(Fear.none) }
138
140
  end
139
141
 
140
- context 'not defined' do
141
- let(:other) { Date.parse('2017-04-15') }
142
+ context "not defined" do
143
+ let(:other) { Date.parse("2017-04-15") }
142
144
 
143
- it { is_expected.to eq(Fear.some(<<-MSG.strip)) }
144
- Expected `4` to match:
145
- Date(year, 02, day)
146
- ~~~~~~~~~~~^
145
+ it { is_expected.to eq(Fear.some(<<~MSG.strip)) }
146
+ Expected `4` to match:
147
+ Date(year, 02, day)
148
+ ~~~~~~~~~~~^
147
149
  MSG
148
150
  end
149
151
  end
@@ -1,9 +1,11 @@
1
- RSpec.describe Fear::Extractor::Grammar, 'Array' do
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe Fear::Extractor::Grammar, "Array" do
2
4
  let(:parser) { Fear::Extractor::GrammarParser.new }
3
5
  let(:matcher) { parser.parse(pattern).to_matcher }
4
6
 
5
- context 'non empty array' do
6
- let(:pattern) { '[1, 2, 3, 4]' }
7
+ context "non empty array" do
8
+ let(:pattern) { "[1, 2, 3, 4]" }
7
9
 
8
10
  it do
9
11
  first = matcher.head
@@ -1,46 +1,48 @@
1
- RSpec.describe 'Fear::Extractor::IdentifiedMatcher' do
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe "Fear::Extractor::IdentifiedMatcher" do
2
4
  let(:parser) { Fear::Extractor::GrammarParser.new }
3
5
  let(:matcher) { parser.parse(pattern).to_matcher }
4
6
 
5
- describe '#defined_at?' do
7
+ describe "#defined_at?" do
6
8
  subject { matcher }
7
9
 
8
- let(:pattern) { 'array @ [1, *tail]' }
10
+ let(:pattern) { "array @ [1, *tail]" }
9
11
 
10
12
  it { is_expected.to be_defined_at([1, 2]) }
11
- it { is_expected.not_to be_defined_at('foo') }
13
+ it { is_expected.not_to be_defined_at("foo") }
12
14
  it { is_expected.not_to be_defined_at([2, 1]) }
13
15
  end
14
16
 
15
- describe '#call' do
16
- subject { matcher.call(other) }
17
+ describe "#call" do
18
+ subject { matcher.(other) }
17
19
 
18
- context 'defined' do
20
+ context "defined" do
19
21
  let(:other) { [1, 2] }
20
- let(:pattern) { 'array @ [1, *tail]' }
22
+ let(:pattern) { "array @ [1, *tail]" }
21
23
 
22
24
  it { is_expected.to eq(array: [1, 2], tail: [2]) }
23
25
  end
24
26
  end
25
27
 
26
- describe '#failure_reason' do
28
+ describe "#failure_reason" do
27
29
  subject { matcher.failure_reason(other) }
28
30
 
29
- let(:pattern) { 'array @ [1, *tail]' }
31
+ let(:pattern) { "array @ [1, *tail]" }
30
32
 
31
- context 'match integer' do
33
+ context "match integer" do
32
34
  let(:other) { [1, 2] }
33
35
 
34
36
  it { is_expected.to eq(Fear.none) }
35
37
  end
36
38
 
37
- context 'does not match float' do
39
+ context "does not match float" do
38
40
  let(:other) { [2, 2] }
39
41
 
40
- it { is_expected.to eq(Fear.some(<<-ERROR.strip)) }
41
- Expected `2` to match:
42
- array @ [1, *tail]
43
- ~~~~~~~~~^
42
+ it { is_expected.to eq(Fear.some(<<~ERROR.strip)) }
43
+ Expected `2` to match:
44
+ array @ [1, *tail]
45
+ ~~~~~~~~~^
44
46
  ERROR
45
47
  end
46
48
  end
@@ -1,65 +1,67 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::Extractor::IdentifierMatcher do
2
4
  let(:parser) { Fear::Extractor::GrammarParser.new }
3
5
  let(:matcher) { parser.parse(pattern).to_matcher }
4
6
 
5
- describe '#defined_at?' do
7
+ describe "#defined_at?" do
6
8
  subject { matcher }
7
9
 
8
- let(:pattern) { 'number' }
10
+ let(:pattern) { "number" }
9
11
 
10
12
  it { is_expected.to be_defined_at(1) }
11
- it { is_expected.to be_defined_at('foo') }
13
+ it { is_expected.to be_defined_at("foo") }
12
14
  it { is_expected.to be_defined_at(1.2) }
13
- it { is_expected.to be_defined_at([1, '2']) }
15
+ it { is_expected.to be_defined_at([1, "2"]) }
14
16
 
15
- context 'within array' do
16
- let(:pattern) { '[1, n, 2]' }
17
+ context "within array" do
18
+ let(:pattern) { "[1, n, 2]" }
17
19
 
18
20
  it { is_expected.to be_defined_at([1, 2, 2]) }
19
- it { is_expected.to be_defined_at([1, 'foo', 2]) }
20
- it { is_expected.not_to be_defined_at([1, 'foo']) }
21
+ it { is_expected.to be_defined_at([1, "foo", 2]) }
22
+ it { is_expected.not_to be_defined_at([1, "foo"]) }
21
23
  end
22
24
  end
23
25
 
24
- describe '#call' do
25
- subject { matcher.call(other) }
26
+ describe "#call" do
27
+ subject { matcher.(other) }
26
28
 
27
- let(:pattern) { '1.0' }
29
+ let(:pattern) { "1.0" }
28
30
 
29
- context 'defined' do
31
+ context "defined" do
30
32
  let(:other) { 1 }
31
33
 
32
34
  it { is_expected.to eq({}) }
33
35
  end
34
36
  end
35
37
 
36
- describe '#failure_reason' do
38
+ describe "#failure_reason" do
37
39
  subject { matcher.failure_reason(other) }
38
40
 
39
- let(:pattern) { '1.0' }
41
+ let(:pattern) { "1.0" }
40
42
 
41
- context 'match integer' do
43
+ context "match integer" do
42
44
  let(:other) { 1 }
43
- let(:pattern) { '1' }
45
+ let(:pattern) { "1" }
44
46
 
45
47
  it { is_expected.to eq(Fear.none) }
46
48
  end
47
49
 
48
- context 'match float' do
50
+ context "match float" do
49
51
  let(:other) { 1.0 }
50
- let(:pattern) { '1' }
52
+ let(:pattern) { "1" }
51
53
 
52
54
  it { is_expected.to eq(Fear.none) }
53
55
  end
54
56
 
55
- context 'does not match another integer' do
57
+ context "does not match another integer" do
56
58
  let(:other) { 2 }
57
- let(:pattern) { '1' }
59
+ let(:pattern) { "1" }
58
60
 
59
- it { is_expected.to eq(Fear.some(<<-ERROR.strip)) }
60
- Expected `2` to match:
61
- 1
62
- ^
61
+ it { is_expected.to eq(Fear.some(<<~ERROR.strip)) }
62
+ Expected `2` to match:
63
+ 1
64
+ ^
63
65
  ERROR
64
66
  end
65
67
  end
@@ -1,31 +1,33 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::Extractor::Pattern do
2
- describe '.new' do
3
- context 'invalid syntax' do
4
- subject { -> { described_class.new('[1, 2, 3') } }
4
+ describe ".new" do
5
+ context "invalid syntax" do
6
+ subject { -> { described_class.new("[1, 2, 3") } }
5
7
 
6
- it 'shows where the error happens' do
8
+ it "shows where the error happens" do
7
9
  is_expected.to raise_error(Fear::PatternSyntaxError) { |error|
8
10
  lines = error.message.split("\n")
9
- expect(lines[0]).to start_with('Expected one of')
10
- .and(end_with('at line 1, column 9 (byte 9):'))
11
+ expect(lines[0]).to start_with("Expected one of")
12
+ .and(end_with("at line 1, column 9 (byte 9):"))
11
13
 
12
- expect(lines[1]).to eq('[1, 2, 3')
13
- expect(lines[2]).to eq('~~~~~~~~^')
14
+ expect(lines[1]).to eq("[1, 2, 3")
15
+ expect(lines[2]).to eq("~~~~~~~~^")
14
16
  }
15
17
  end
16
18
  end
17
19
  end
18
20
 
19
- describe '#failure_reason' do
20
- let(:pattern) { described_class.new('Some([:err, 444])') }
21
+ describe "#failure_reason" do
22
+ let(:pattern) { described_class.new("Some([:err, 444])") }
21
23
 
22
- context 'not defined' do
24
+ context "not defined" do
23
25
  subject { pattern.failure_reason(Fear.some([:err, 445])) }
24
26
 
25
- it { is_expected.to eq(<<-MSG.strip) }
26
- Expected `445` to match:
27
- Some([:err, 444])
28
- ~~~~~~~~~~~~^
27
+ it { is_expected.to eq(<<~MSG.strip) }
28
+ Expected `445` to match:
29
+ Some([:err, 444])
30
+ ~~~~~~~~~~~~^
29
31
  MSG
30
32
  end
31
33
  end
@@ -1,61 +1,63 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Fear::Extractor::TypedIdentifierMatcher do
2
4
  let(:parser) { Fear::Extractor::GrammarParser.new }
3
5
  let(:matcher) { parser.parse(pattern).to_matcher }
4
6
 
5
- describe '#defined_at?' do
7
+ describe "#defined_at?" do
6
8
  subject { matcher }
7
9
 
8
- let(:pattern) { 'var : Integer' }
10
+ let(:pattern) { "var : Integer" }
9
11
 
10
12
  it { is_expected.to be_defined_at(1) }
11
- it { is_expected.not_to be_defined_at('foo') }
13
+ it { is_expected.not_to be_defined_at("foo") }
12
14
  it { is_expected.not_to be_defined_at(1.2) }
13
15
 
14
- context 'within array' do
15
- let(:pattern) { '[1, n : String, 2]' }
16
+ context "within array" do
17
+ let(:pattern) { "[1, n : String, 2]" }
16
18
 
17
- it { is_expected.to be_defined_at([1, 'foo', 2]) }
19
+ it { is_expected.to be_defined_at([1, "foo", 2]) }
18
20
  it { is_expected.not_to be_defined_at([1, 2, 2]) }
19
- it { is_expected.not_to be_defined_at([1, 'foo']) }
21
+ it { is_expected.not_to be_defined_at([1, "foo"]) }
20
22
  end
21
23
  end
22
24
 
23
- describe '#call' do
24
- subject { matcher.call(other) }
25
+ describe "#call" do
26
+ subject { matcher.(other) }
25
27
 
26
- context 'defined' do
28
+ context "defined" do
27
29
  let(:other) { 1 }
28
- let(:pattern) { 'var : Integer' }
30
+ let(:pattern) { "var : Integer" }
29
31
 
30
32
  it { is_expected.to eq(var: 1) }
31
33
  end
32
34
 
33
- context 'defined within array' do
35
+ context "defined within array" do
34
36
  let(:other) { [4, 2, 1, 6] }
35
- let(:pattern) { '[head : Integer, *tail]' }
37
+ let(:pattern) { "[head : Integer, *tail]" }
36
38
 
37
39
  it { is_expected.to eq(head: 4, tail: [2, 1, 6]) }
38
40
  end
39
41
  end
40
42
 
41
- describe '#' do
43
+ describe "#" do
42
44
  subject { matcher.failure_reason(other) }
43
45
 
44
- let(:pattern) { 'var : Integer' }
46
+ let(:pattern) { "var : Integer" }
45
47
 
46
- context 'match integer' do
48
+ context "match integer" do
47
49
  let(:other) { 1 }
48
50
 
49
51
  it { is_expected.to eq(Fear.none) }
50
52
  end
51
53
 
52
- context 'does not match float' do
54
+ context "does not match float" do
53
55
  let(:other) { 1.0 }
54
56
 
55
- it { is_expected.to eq(Fear.some(<<-ERROR.strip)) }
56
- Expected `1.0` to match:
57
- var : Integer
58
- ~~~~~~^
57
+ it { is_expected.to eq(Fear.some(<<~ERROR.strip)) }
58
+ Expected `1.0` to match:
59
+ var : Integer
60
+ ~~~~~~^
59
61
  ERROR
60
62
  end
61
63
  end