mutant 0.9.3 → 0.9.4
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 +4 -4
- data/Changelog.md +4 -0
- data/Gemfile.lock +10 -2
- data/lib/mutant.rb +3 -1
- data/lib/mutant/cli.rb +4 -4
- data/lib/mutant/integration.rb +1 -1
- data/lib/mutant/license.rb +1 -1
- data/lib/mutant/license/subscription/opensource.rb +1 -1
- data/lib/mutant/transform.rb +6 -5
- data/lib/mutant/version.rb +1 -1
- data/mutant.gemspec +13 -12
- metadata +18 -9
- data/lib/mutant/base.rb +0 -192
- data/spec/unit/mutant/either_spec.rb +0 -247
- data/spec/unit/mutant/maybe_spec.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5194ccc2d7c83d425c53dc7339242277010dcac6715248380417f936d88f7eda
|
4
|
+
data.tar.gz: ba35d0efea5be46b335947acd7452d72df6917deba2e6ccad96d8e0b60bdb2e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a63b99d244b957e3b3664243ed8a37704b2bdc596be0020de7f5665351958d941ec1be81584af798f7c0b63011d5cd689b4d3b77686469d869670592bffdecf4
|
7
|
+
data.tar.gz: 76c702695a6e04f874a73952fb153065bb0f76ebd098b50b6bb6e7b670568ca842aa78b70c71abb8728248eacf0e28ef123c02eab4c443d4a896fe3939ff453b
|
data/Changelog.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -37,7 +37,7 @@ GIT
|
|
37
37
|
PATH
|
38
38
|
remote: .
|
39
39
|
specs:
|
40
|
-
mutant (0.9.
|
40
|
+
mutant (0.9.4)
|
41
41
|
abstract_type (~> 0.0.7)
|
42
42
|
adamantium (~> 0.2.0)
|
43
43
|
anima (~> 0.3.1)
|
@@ -47,9 +47,10 @@ PATH
|
|
47
47
|
equalizer (~> 0.0.9)
|
48
48
|
ice_nine (~> 0.11.1)
|
49
49
|
memoizable (~> 0.4.2)
|
50
|
+
mprelude (~> 0.1.0)
|
50
51
|
parser (~> 2.6.5)
|
51
52
|
procto (~> 0.0.2)
|
52
|
-
unparser (~> 0.4.
|
53
|
+
unparser (~> 0.4.6)
|
53
54
|
|
54
55
|
GEM
|
55
56
|
remote: https://rubygems.org/
|
@@ -96,6 +97,13 @@ GEM
|
|
96
97
|
kwalify (0.7.2)
|
97
98
|
memoizable (0.4.2)
|
98
99
|
thread_safe (~> 0.3, >= 0.3.1)
|
100
|
+
mprelude (0.1.0)
|
101
|
+
abstract_type (~> 0.0.7)
|
102
|
+
adamantium (~> 0.2.0)
|
103
|
+
concord (~> 0.1.5)
|
104
|
+
equalizer (~> 0.0.9)
|
105
|
+
ice_nine (~> 0.11.1)
|
106
|
+
procto (~> 0.0.2)
|
99
107
|
mutant-license (0.1.0)
|
100
108
|
parallel (1.19.1)
|
101
109
|
parser (2.6.5.0)
|
data/lib/mutant.rb
CHANGED
@@ -10,6 +10,7 @@ require 'digest/sha1'
|
|
10
10
|
require 'equalizer'
|
11
11
|
require 'etc'
|
12
12
|
require 'ice_nine'
|
13
|
+
require 'mprelude'
|
13
14
|
require 'json'
|
14
15
|
require 'open3'
|
15
16
|
require 'optparse'
|
@@ -30,13 +31,14 @@ Thread.abort_on_exception = true
|
|
30
31
|
#
|
31
32
|
# @api private
|
32
33
|
module Mutant
|
34
|
+
Either = MPrelude::Either
|
35
|
+
|
33
36
|
EMPTY_STRING = ''
|
34
37
|
EMPTY_ARRAY = [].freeze
|
35
38
|
EMPTY_HASH = {}.freeze
|
36
39
|
SCOPE_OPERATOR = '::'
|
37
40
|
end # Mutant
|
38
41
|
|
39
|
-
require 'mutant/base'
|
40
42
|
require 'mutant/bootstrap'
|
41
43
|
require 'mutant/version'
|
42
44
|
require 'mutant/env'
|
data/lib/mutant/cli.rb
CHANGED
@@ -36,10 +36,10 @@ module Mutant
|
|
36
36
|
def self.run(world, default_config, arguments)
|
37
37
|
License
|
38
38
|
.apply(world)
|
39
|
-
.
|
40
|
-
.
|
41
|
-
.
|
42
|
-
.
|
39
|
+
.bind { Config.load_config_file(world, default_config) }
|
40
|
+
.bind { |file_config| apply(world, file_config, arguments) }
|
41
|
+
.bind { |cli_config| Bootstrap.apply(world, cli_config) }
|
42
|
+
.bind(&Runner.method(:apply))
|
43
43
|
.from_right { |error| world.stderr.puts(error); return false }
|
44
44
|
.success?
|
45
45
|
end
|
data/lib/mutant/integration.rb
CHANGED
data/lib/mutant/license.rb
CHANGED
@@ -23,7 +23,7 @@ module Mutant
|
|
23
23
|
load_mutant_license(world)
|
24
24
|
.fmap { license_path(world) }
|
25
25
|
.fmap { |path| Subscription.from_json(world.json.load(path)) }
|
26
|
-
.
|
26
|
+
.bind { |sub| sub.apply(world) }
|
27
27
|
end
|
28
28
|
private_class_method :license_result
|
29
29
|
|
data/lib/mutant/transform.rb
CHANGED
@@ -263,7 +263,7 @@ module Mutant
|
|
263
263
|
PRIMITIVE
|
264
264
|
.apply(input)
|
265
265
|
.lmap(&method(:lift_error))
|
266
|
-
.
|
266
|
+
.bind(&method(:run))
|
267
267
|
end
|
268
268
|
|
269
269
|
private
|
@@ -351,8 +351,8 @@ module Mutant
|
|
351
351
|
PRIMITIVE
|
352
352
|
.apply(input)
|
353
353
|
.lmap(&method(:lift_error))
|
354
|
-
.
|
355
|
-
.
|
354
|
+
.bind(&method(:reject_keys))
|
355
|
+
.bind(&method(:transform))
|
356
356
|
end
|
357
357
|
|
358
358
|
private
|
@@ -363,7 +363,7 @@ module Mutant
|
|
363
363
|
#
|
364
364
|
# @return [Either<Error, Hash>]
|
365
365
|
def transform(input)
|
366
|
-
transform_required(input).
|
366
|
+
transform_required(input).bind do |required|
|
367
367
|
transform_optional(input).fmap(&required.method(:merge))
|
368
368
|
end
|
369
369
|
end
|
@@ -503,7 +503,8 @@ module Mutant
|
|
503
503
|
#
|
504
504
|
# @return [Either<Error, Object>]
|
505
505
|
def apply(input)
|
506
|
-
Either
|
506
|
+
Either
|
507
|
+
.wrap_error(error_class) { block.call(input) }
|
507
508
|
.lmap { |exception| error(input: input, message: exception.to_s) }
|
508
509
|
end
|
509
510
|
end # Exception
|
data/lib/mutant/version.rb
CHANGED
data/mutant.gemspec
CHANGED
@@ -21,18 +21,19 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.extra_rdoc_files = %w[LICENSE]
|
22
22
|
gem.executables = %w[mutant]
|
23
23
|
|
24
|
-
gem.add_runtime_dependency('abstract_type',
|
25
|
-
gem.add_runtime_dependency('adamantium',
|
26
|
-
gem.add_runtime_dependency('anima',
|
27
|
-
gem.add_runtime_dependency('ast',
|
28
|
-
gem.add_runtime_dependency('concord',
|
29
|
-
gem.add_runtime_dependency('diff-lcs',
|
30
|
-
gem.add_runtime_dependency('equalizer',
|
31
|
-
gem.add_runtime_dependency('ice_nine',
|
32
|
-
gem.add_runtime_dependency('memoizable',
|
33
|
-
gem.add_runtime_dependency('
|
34
|
-
gem.add_runtime_dependency('
|
35
|
-
gem.add_runtime_dependency('
|
24
|
+
gem.add_runtime_dependency('abstract_type', '~> 0.0.7')
|
25
|
+
gem.add_runtime_dependency('adamantium', '~> 0.2.0')
|
26
|
+
gem.add_runtime_dependency('anima', '~> 0.3.1')
|
27
|
+
gem.add_runtime_dependency('ast', '~> 2.2')
|
28
|
+
gem.add_runtime_dependency('concord', '~> 0.1.5')
|
29
|
+
gem.add_runtime_dependency('diff-lcs', '~> 1.3')
|
30
|
+
gem.add_runtime_dependency('equalizer', '~> 0.0.9')
|
31
|
+
gem.add_runtime_dependency('ice_nine', '~> 0.11.1')
|
32
|
+
gem.add_runtime_dependency('memoizable', '~> 0.4.2')
|
33
|
+
gem.add_runtime_dependency('mprelude', '~> 0.1.0')
|
34
|
+
gem.add_runtime_dependency('parser', '~> 2.6.5')
|
35
|
+
gem.add_runtime_dependency('procto', '~> 0.0.2')
|
36
|
+
gem.add_runtime_dependency('unparser', '~> 0.4.6')
|
36
37
|
|
37
38
|
gem.add_development_dependency('devtools', '~> 0.1.23')
|
38
39
|
gem.add_development_dependency('parallel', '~> 1.3')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 0.4.2
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: mprelude
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: 0.1.0
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.1.0
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: parser
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,14 +184,14 @@ dependencies:
|
|
170
184
|
requirements:
|
171
185
|
- - "~>"
|
172
186
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0.4.
|
187
|
+
version: 0.4.6
|
174
188
|
type: :runtime
|
175
189
|
prerelease: false
|
176
190
|
version_requirements: !ruby/object:Gem::Requirement
|
177
191
|
requirements:
|
178
192
|
- - "~>"
|
179
193
|
- !ruby/object:Gem::Version
|
180
|
-
version: 0.4.
|
194
|
+
version: 0.4.6
|
181
195
|
- !ruby/object:Gem::Dependency
|
182
196
|
name: devtools
|
183
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -252,7 +266,6 @@ files:
|
|
252
266
|
- lib/mutant/ast/nodes.rb
|
253
267
|
- lib/mutant/ast/sexp.rb
|
254
268
|
- lib/mutant/ast/types.rb
|
255
|
-
- lib/mutant/base.rb
|
256
269
|
- lib/mutant/bootstrap.rb
|
257
270
|
- lib/mutant/cli.rb
|
258
271
|
- lib/mutant/color.rb
|
@@ -499,7 +512,6 @@ files:
|
|
499
512
|
- spec/unit/mutant/config_spec.rb
|
500
513
|
- spec/unit/mutant/context_spec.rb
|
501
514
|
- spec/unit/mutant/diff_spec.rb
|
502
|
-
- spec/unit/mutant/either_spec.rb
|
503
515
|
- spec/unit/mutant/env_spec.rb
|
504
516
|
- spec/unit/mutant/expression/method_spec.rb
|
505
517
|
- spec/unit/mutant/expression/methods_spec.rb
|
@@ -527,7 +539,6 @@ files:
|
|
527
539
|
- spec/unit/mutant/matcher/scope_spec.rb
|
528
540
|
- spec/unit/mutant/matcher/static_spec.rb
|
529
541
|
- spec/unit/mutant/matcher_spec.rb
|
530
|
-
- spec/unit/mutant/maybe_spec.rb
|
531
542
|
- spec/unit/mutant/meta/example/dsl_spec.rb
|
532
543
|
- spec/unit/mutant/meta/example/verification_spec.rb
|
533
544
|
- spec/unit/mutant/meta/example_spec.rb
|
@@ -613,7 +624,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
613
624
|
- !ruby/object:Gem::Version
|
614
625
|
version: '0'
|
615
626
|
requirements: []
|
616
|
-
rubygems_version: 3.0.
|
627
|
+
rubygems_version: 3.0.6
|
617
628
|
signing_key:
|
618
629
|
specification_version: 4
|
619
630
|
summary: ''
|
@@ -637,7 +648,6 @@ test_files:
|
|
637
648
|
- spec/unit/mutant/config_spec.rb
|
638
649
|
- spec/unit/mutant/context_spec.rb
|
639
650
|
- spec/unit/mutant/diff_spec.rb
|
640
|
-
- spec/unit/mutant/either_spec.rb
|
641
651
|
- spec/unit/mutant/env_spec.rb
|
642
652
|
- spec/unit/mutant/expression/method_spec.rb
|
643
653
|
- spec/unit/mutant/expression/methods_spec.rb
|
@@ -665,7 +675,6 @@ test_files:
|
|
665
675
|
- spec/unit/mutant/matcher/scope_spec.rb
|
666
676
|
- spec/unit/mutant/matcher/static_spec.rb
|
667
677
|
- spec/unit/mutant/matcher_spec.rb
|
668
|
-
- spec/unit/mutant/maybe_spec.rb
|
669
678
|
- spec/unit/mutant/meta/example/dsl_spec.rb
|
670
679
|
- spec/unit/mutant/meta/example/verification_spec.rb
|
671
680
|
- spec/unit/mutant/meta/example_spec.rb
|
data/lib/mutant/base.rb
DELETED
@@ -1,192 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Mutant
|
4
|
-
module Functor
|
5
|
-
include AbstractType
|
6
|
-
|
7
|
-
abstract_method :fmap
|
8
|
-
|
9
|
-
private
|
10
|
-
|
11
|
-
# Raise error unless block is provided
|
12
|
-
#
|
13
|
-
# @raise [MissingBlockError]
|
14
|
-
# if no block is given
|
15
|
-
#
|
16
|
-
# @return [self]
|
17
|
-
def require_block
|
18
|
-
fail LocalJumpError unless block_given?
|
19
|
-
self
|
20
|
-
end
|
21
|
-
end # Functor
|
22
|
-
|
23
|
-
class Maybe
|
24
|
-
include(
|
25
|
-
AbstractType,
|
26
|
-
Adamantium::Flat,
|
27
|
-
Functor
|
28
|
-
)
|
29
|
-
|
30
|
-
class Nothing < self
|
31
|
-
instance = new
|
32
|
-
|
33
|
-
define_method(:new) { instance }
|
34
|
-
|
35
|
-
# Evaluate functor block
|
36
|
-
#
|
37
|
-
# @return [Maybe::Nothing]
|
38
|
-
def fmap(&block)
|
39
|
-
require_block(&block)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Evaluate applicative block
|
43
|
-
#
|
44
|
-
# @return [Maybe::Nothing]
|
45
|
-
def apply(&block)
|
46
|
-
require_block(&block)
|
47
|
-
end
|
48
|
-
end # Nothing
|
49
|
-
|
50
|
-
class Just < self
|
51
|
-
include Concord.new(:value)
|
52
|
-
|
53
|
-
# Evalute functor block
|
54
|
-
#
|
55
|
-
# @return [Maybe::Just<Object>]
|
56
|
-
def fmap
|
57
|
-
Just.new(yield(value))
|
58
|
-
end
|
59
|
-
|
60
|
-
# Evalute applicative block
|
61
|
-
#
|
62
|
-
# @return [Maybe]
|
63
|
-
def apply
|
64
|
-
yield(value)
|
65
|
-
end
|
66
|
-
end # Just
|
67
|
-
end # Maybe
|
68
|
-
|
69
|
-
class Either
|
70
|
-
include(
|
71
|
-
AbstractType,
|
72
|
-
Adamantium::Flat,
|
73
|
-
Concord.new(:value),
|
74
|
-
Functor
|
75
|
-
)
|
76
|
-
|
77
|
-
# Execute block and wrap error in left
|
78
|
-
#
|
79
|
-
# @param [Class:Exception] error
|
80
|
-
#
|
81
|
-
# @return [Either<Exception, Object>]
|
82
|
-
def self.wrap_error(error)
|
83
|
-
Right.new(yield)
|
84
|
-
rescue error => exception
|
85
|
-
Left.new(exception)
|
86
|
-
end
|
87
|
-
|
88
|
-
class Left < self
|
89
|
-
# Evaluate functor block
|
90
|
-
#
|
91
|
-
# @return [Either::Left<Object>]
|
92
|
-
def fmap(&block)
|
93
|
-
require_block(&block)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Evaluate applicative block
|
97
|
-
#
|
98
|
-
# @return [Either::Left<Object>]
|
99
|
-
def apply(&block)
|
100
|
-
require_block(&block)
|
101
|
-
end
|
102
|
-
|
103
|
-
# Unwrap value from left
|
104
|
-
#
|
105
|
-
# @return [Object]
|
106
|
-
def from_left
|
107
|
-
value
|
108
|
-
end
|
109
|
-
|
110
|
-
# Unwrap value from right
|
111
|
-
#
|
112
|
-
# @return [Object]
|
113
|
-
#
|
114
|
-
# rubocop:disable Style/GuardClause
|
115
|
-
def from_right
|
116
|
-
if block_given?
|
117
|
-
yield(value)
|
118
|
-
else
|
119
|
-
fail "Expected right value, got #{inspect}"
|
120
|
-
end
|
121
|
-
end
|
122
|
-
# rubocop:enable Style/GuardClause
|
123
|
-
|
124
|
-
# Map over left value
|
125
|
-
#
|
126
|
-
# @return [Either::Right<Object>]
|
127
|
-
def lmap
|
128
|
-
Left.new(yield(value))
|
129
|
-
end
|
130
|
-
|
131
|
-
# Evaluate left side of branch
|
132
|
-
#
|
133
|
-
# @param [#call] left
|
134
|
-
# @param [#call] _right
|
135
|
-
def either(left, _right)
|
136
|
-
left.call(value)
|
137
|
-
end
|
138
|
-
end # Left
|
139
|
-
|
140
|
-
class Right < self
|
141
|
-
# Evaluate functor block
|
142
|
-
#
|
143
|
-
# @return [Either::Right<Object>]
|
144
|
-
def fmap
|
145
|
-
Right.new(yield(value))
|
146
|
-
end
|
147
|
-
|
148
|
-
# Evaluate applicative block
|
149
|
-
#
|
150
|
-
# @return [Either<Object>]
|
151
|
-
def apply
|
152
|
-
yield(value)
|
153
|
-
end
|
154
|
-
|
155
|
-
# Unwrap value from left
|
156
|
-
#
|
157
|
-
# @return [Object]
|
158
|
-
#
|
159
|
-
# rubocop:disable Style/GuardClause
|
160
|
-
def from_left
|
161
|
-
if block_given?
|
162
|
-
yield(value)
|
163
|
-
else
|
164
|
-
fail "Expected left value, got #{inspect}"
|
165
|
-
end
|
166
|
-
end
|
167
|
-
# rubocop:enable Style/GuardClause
|
168
|
-
|
169
|
-
# Unwrap value from right
|
170
|
-
#
|
171
|
-
# @return [Object]
|
172
|
-
def from_right
|
173
|
-
value
|
174
|
-
end
|
175
|
-
|
176
|
-
# Map over left value
|
177
|
-
#
|
178
|
-
# @return [Either::Right<Object>]
|
179
|
-
def lmap(&block)
|
180
|
-
require_block(&block)
|
181
|
-
end
|
182
|
-
|
183
|
-
# Evaluate right side of branch
|
184
|
-
#
|
185
|
-
# @param [#call] _left
|
186
|
-
# @param [#call] right
|
187
|
-
def either(_left, right)
|
188
|
-
right.call(value)
|
189
|
-
end
|
190
|
-
end # Right
|
191
|
-
end # Either
|
192
|
-
end # Mutant
|
@@ -1,247 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Either do
|
4
|
-
describe '.wrap_error' do
|
5
|
-
def apply
|
6
|
-
described_class.wrap_error(error, &block)
|
7
|
-
end
|
8
|
-
|
9
|
-
let(:error) { TestError }
|
10
|
-
|
11
|
-
class TestError < RuntimeError; end
|
12
|
-
|
13
|
-
context 'when block returns' do
|
14
|
-
let(:value) { instance_double(Object, 'value') }
|
15
|
-
let(:block) { -> { value } }
|
16
|
-
|
17
|
-
it 'returns right wrapping block value' do
|
18
|
-
expect(apply).to eql(described_class::Right.new(value))
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
context 'when block raises' do
|
23
|
-
let(:exception) { error.new }
|
24
|
-
let(:block) { -> { fail exception } }
|
25
|
-
|
26
|
-
context 'with covered exception' do
|
27
|
-
it 'returns left wrapping exception' do
|
28
|
-
expect(apply).to eql(described_class::Left.new(exception))
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'with uncovered exception' do
|
33
|
-
let(:exception) { StandardError.new }
|
34
|
-
|
35
|
-
it 'returns raises error' do
|
36
|
-
expect { apply }.to raise_error(StandardError)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
RSpec.describe Mutant::Either::Left do
|
44
|
-
subject { described_class.new(value) }
|
45
|
-
|
46
|
-
let(:block_result) { instance_double(Object, 'block result') }
|
47
|
-
let(:value) { instance_double(Object, 'value') }
|
48
|
-
let(:yields) { [] }
|
49
|
-
|
50
|
-
let(:block) do
|
51
|
-
lambda do |value|
|
52
|
-
yields << value
|
53
|
-
block_result
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class TestError < RuntimeError; end
|
58
|
-
|
59
|
-
describe '#fmap' do
|
60
|
-
def apply
|
61
|
-
subject.fmap(&block)
|
62
|
-
end
|
63
|
-
|
64
|
-
include_examples 'no block evaluation'
|
65
|
-
include_examples 'requires block'
|
66
|
-
include_examples 'returns self'
|
67
|
-
end
|
68
|
-
|
69
|
-
describe '#apply' do
|
70
|
-
def apply
|
71
|
-
subject.apply(&block)
|
72
|
-
end
|
73
|
-
|
74
|
-
include_examples 'no block evaluation'
|
75
|
-
include_examples 'requires block'
|
76
|
-
include_examples 'returns self'
|
77
|
-
end
|
78
|
-
|
79
|
-
describe '#from_left' do
|
80
|
-
def apply
|
81
|
-
subject.from_left(&block)
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'returns left value' do
|
85
|
-
expect(apply).to be(value)
|
86
|
-
end
|
87
|
-
|
88
|
-
include_examples 'no block evaluation'
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#from_right' do
|
92
|
-
def apply
|
93
|
-
subject.from_right(&block)
|
94
|
-
end
|
95
|
-
|
96
|
-
context 'without block' do
|
97
|
-
let(:block) { nil }
|
98
|
-
|
99
|
-
it 'raises RuntimeError error' do
|
100
|
-
expect { apply }.to raise_error(
|
101
|
-
RuntimeError,
|
102
|
-
"Expected right value, got #{subject.inspect}"
|
103
|
-
)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
context 'with block' do
|
108
|
-
let(:yields) { [] }
|
109
|
-
let(:block_return) { instance_double(Object, 'block-return') }
|
110
|
-
|
111
|
-
let(:block) do
|
112
|
-
lambda do |value|
|
113
|
-
yields << value
|
114
|
-
block_return
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'calls block with left value' do
|
119
|
-
expect { apply }.to change(yields, :to_a).from([]).to([value])
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'returns block value' do
|
123
|
-
expect(apply).to be(block_return)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
describe '#lmap' do
|
129
|
-
def apply
|
130
|
-
subject.lmap(&block)
|
131
|
-
end
|
132
|
-
|
133
|
-
include_examples 'requires block'
|
134
|
-
include_examples 'Functor#fmap block evaluation'
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#either' do
|
138
|
-
def apply
|
139
|
-
subject.either(block, -> { fail })
|
140
|
-
end
|
141
|
-
|
142
|
-
include_examples '#apply block evaluation'
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
RSpec.describe Mutant::Either::Right do
|
147
|
-
subject { described_class.new(value) }
|
148
|
-
|
149
|
-
let(:block_result) { instance_double(Object, 'block result') }
|
150
|
-
let(:value) { instance_double(Object, 'value') }
|
151
|
-
let(:yields) { [] }
|
152
|
-
|
153
|
-
let(:block) do
|
154
|
-
lambda do |value|
|
155
|
-
yields << value
|
156
|
-
block_result
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
describe '#fmap' do
|
161
|
-
def apply
|
162
|
-
subject.fmap(&block)
|
163
|
-
end
|
164
|
-
|
165
|
-
include_examples 'requires block'
|
166
|
-
include_examples 'Functor#fmap block evaluation'
|
167
|
-
end
|
168
|
-
|
169
|
-
describe '#apply' do
|
170
|
-
def apply
|
171
|
-
subject.apply(&block)
|
172
|
-
end
|
173
|
-
|
174
|
-
include_examples 'requires block'
|
175
|
-
include_examples '#apply block evaluation'
|
176
|
-
end
|
177
|
-
|
178
|
-
describe '#from_left' do
|
179
|
-
def apply
|
180
|
-
subject.from_left(&block)
|
181
|
-
end
|
182
|
-
|
183
|
-
context 'without block' do
|
184
|
-
let(:block) { nil }
|
185
|
-
|
186
|
-
it 'raises RuntimeError error' do
|
187
|
-
expect { apply }.to raise_error(
|
188
|
-
RuntimeError,
|
189
|
-
"Expected left value, got #{subject.inspect}"
|
190
|
-
)
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
context 'with block' do
|
195
|
-
let(:yields) { [] }
|
196
|
-
let(:block_return) { instance_double(Object, 'block-return') }
|
197
|
-
|
198
|
-
let(:block) do
|
199
|
-
lambda do |value|
|
200
|
-
yields << value
|
201
|
-
block_return
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
it 'calls block with right value' do
|
206
|
-
expect { apply }.to change(yields, :to_a).from([]).to([value])
|
207
|
-
end
|
208
|
-
|
209
|
-
it 'returns block value' do
|
210
|
-
expect(apply).to be(block_return)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
end
|
214
|
-
|
215
|
-
describe '#from_right' do
|
216
|
-
def apply
|
217
|
-
subject.from_right(&block)
|
218
|
-
end
|
219
|
-
|
220
|
-
it 'returns right value' do
|
221
|
-
expect(apply).to be(value)
|
222
|
-
end
|
223
|
-
|
224
|
-
include_examples 'no block evaluation'
|
225
|
-
end
|
226
|
-
|
227
|
-
describe '#lmap' do
|
228
|
-
def apply
|
229
|
-
subject.lmap(&block)
|
230
|
-
end
|
231
|
-
|
232
|
-
include_examples 'requires block'
|
233
|
-
include_examples 'no block evaluation'
|
234
|
-
|
235
|
-
it 'returns self' do
|
236
|
-
expect(apply).to be(subject)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
|
240
|
-
describe '#either' do
|
241
|
-
def apply
|
242
|
-
subject.either(-> { fail }, block)
|
243
|
-
end
|
244
|
-
|
245
|
-
include_examples '#apply block evaluation'
|
246
|
-
end
|
247
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Maybe::Nothing do
|
4
|
-
subject { described_class.new }
|
5
|
-
|
6
|
-
let(:block) { -> {} }
|
7
|
-
|
8
|
-
describe '#fmap' do
|
9
|
-
def apply
|
10
|
-
subject.fmap(&block)
|
11
|
-
end
|
12
|
-
|
13
|
-
include_examples 'no block evaluation'
|
14
|
-
include_examples 'requires block'
|
15
|
-
include_examples 'returns self'
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '#apply' do
|
19
|
-
def apply
|
20
|
-
subject.apply(&block)
|
21
|
-
end
|
22
|
-
|
23
|
-
include_examples 'no block evaluation'
|
24
|
-
include_examples 'requires block'
|
25
|
-
include_examples 'returns self'
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
RSpec.describe Mutant::Maybe::Just do
|
30
|
-
subject { described_class.new(value) }
|
31
|
-
|
32
|
-
let(:block_result) { instance_double(Object, 'block result') }
|
33
|
-
let(:value) { instance_double(Object, 'value') }
|
34
|
-
let(:yields) { [] }
|
35
|
-
|
36
|
-
let(:block) do
|
37
|
-
lambda do |value|
|
38
|
-
yields << value
|
39
|
-
block_result
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
describe '#fmap' do
|
44
|
-
def apply
|
45
|
-
subject.fmap(&block)
|
46
|
-
end
|
47
|
-
|
48
|
-
include_examples 'requires block'
|
49
|
-
include_examples 'Functor#fmap block evaluation'
|
50
|
-
end
|
51
|
-
|
52
|
-
describe '#apply' do
|
53
|
-
def apply
|
54
|
-
subject.apply(&block)
|
55
|
-
end
|
56
|
-
|
57
|
-
include_examples 'requires block'
|
58
|
-
include_examples '#apply block evaluation'
|
59
|
-
end
|
60
|
-
end
|