dry-monads 1.6.0 → 1.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8ccc6809b903aa20a600330e62b86d8164da8394f2b7c63740d6708c73386578
4
- data.tar.gz: a1c92edd9908da609bfe9048bf5ca1220d1f7e4c2cc894df9ea025e7df578625
3
+ metadata.gz: 4c3b21d3e3072a7a21013aa3fc863b50e1aca7707122980adcc5313bff792743
4
+ data.tar.gz: 9b3df76a0c3ce66eb88e8e1bf6b66804f43268b56cb407310944ca7e51614469
5
5
  SHA512:
6
- metadata.gz: 9286042f25cbb89f74d7159ef238cb834f7dddc74890c7d575978a14bd69d8d95aa46728c0f7dbfa81507af068cba4f3efa871eed9ec60d95da62db6f9810320
7
- data.tar.gz: d723b367ba2014fa7bf907316dd93cff45be330329c83281a8640aaaa480a83c20e222d8d89736caf6acc6675c61927e3e54bf0ecb1b4df73ec1d5e2999f0d9a
6
+ metadata.gz: 4056e685a4f47e8168fc97ddb4d773ad5f257d9fcc9d484e35221016961ccb525c475b0f20a9ac48ea7f7a14bfbd6ebe98b4672d7695c687efb3ffd8ebd6244b
7
+ data.tar.gz: 28740b0f45b4e782b9def280eb1f527ce2d970a901d60d883129c31338e481ebb9190836ceb63330e555958a873185d9ae6ad869edd22ab3623975564328d30f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
+ ## 1.7.0 2025-01-07
4
+
5
+
6
+ ### Fixed
7
+
8
+ - Fix pattern matching for `Try` values (@alexkalderimis)
9
+
10
+ ### Changed
11
+
12
+ - Set 3.1 as minimum Ruby version (@flash-gordon)
13
+
14
+ [Compare v1.6.0...v1.7.0](https://github.com/dry-rb/dry-monads/compare/v1.6.0...v1.7.0)
15
+
3
16
  ## 1.6.0 2022-11-04
4
17
 
5
18
 
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2015-2022 dry-rb team
3
+ Copyright (c) 2015-2023 dry-rb team
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
6
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,29 +1,21 @@
1
1
  <!--- this file is synced from dry-rb/template-gem project -->
2
2
  [gem]: https://rubygems.org/gems/dry-monads
3
3
  [actions]: https://github.com/dry-rb/dry-monads/actions
4
- [codacy]: https://www.codacy.com/gh/dry-rb/dry-monads
5
- [chat]: https://dry-rb.zulipchat.com
6
- [inchpages]: http://inch-ci.org/github/dry-rb/dry-monads
7
4
 
8
- # dry-monads [![Join the chat at https://dry-rb.zulipchat.com](https://img.shields.io/badge/dry--rb-join%20chat-%23346b7a.svg)][chat]
9
-
10
- [![Gem Version](https://badge.fury.io/rb/dry-monads.svg)][gem]
11
- [![CI Status](https://github.com/dry-rb/dry-monads/workflows/ci/badge.svg)][actions]
12
- [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f2eed41bf7f04b38b0a7691c2cf6e73c)][codacy]
13
- [![Codacy Badge](https://api.codacy.com/project/badge/Coverage/f2eed41bf7f04b38b0a7691c2cf6e73c)][codacy]
14
- [![Inline docs](http://inch-ci.org/github/dry-rb/dry-monads.svg?branch=main)][inchpages]
5
+ # dry-monads [![Gem Version](https://badge.fury.io/rb/dry-monads.svg)][gem] [![CI Status](https://github.com/dry-rb/dry-monads/workflows/CI/badge.svg)][actions]
15
6
 
16
7
  ## Links
17
8
 
18
9
  * [User documentation](https://dry-rb.org/gems/dry-monads)
19
10
  * [API documentation](http://rubydoc.info/gems/dry-monads)
11
+ * [Forum](https://discourse.dry-rb.org)
20
12
 
21
13
  ## Supported Ruby versions
22
14
 
23
15
  This library officially supports the following Ruby versions:
24
16
 
25
- * MRI `>= 2.7.0`
26
- * jruby `>= 9.3` (postponed until 2.7 is supported)
17
+ * MRI `>= 3.1`
18
+ * jruby `>= 9.4` (not tested on CI)
27
19
 
28
20
  ## License
29
21
 
data/dry-monads.gemspec CHANGED
@@ -21,19 +21,16 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = []
22
22
  spec.require_paths = ["lib"]
23
23
 
24
- spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
- spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-monads/blob/main/CHANGELOG.md"
26
- spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-monads"
27
- spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-monads/issues"
24
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-monads/blob/main/CHANGELOG.md"
26
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-monads"
27
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-monads/issues"
28
+ spec.metadata["rubygems_mfa_required"] = "true"
28
29
 
29
- spec.required_ruby_version = ">= 2.7.0"
30
+ spec.required_ruby_version = ">= 3.1.0"
30
31
 
31
32
  # to update dependencies edit project.yml
32
- spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
33
- spec.add_runtime_dependency "dry-core", "~> 1.0", "< 2"
34
- spec.add_runtime_dependency "zeitwerk", "~> 2.6"
35
-
36
- spec.add_development_dependency "bundler"
37
- spec.add_development_dependency "rake"
38
- spec.add_development_dependency "rspec"
33
+ spec.add_dependency "concurrent-ruby", "~> 1.0"
34
+ spec.add_dependency "dry-core", "~> 1.1"
35
+ spec.add_dependency "zeitwerk", "~> 2.6"
39
36
  end
@@ -4,7 +4,7 @@ module Dry
4
4
  module Monads
5
5
  module ConversionStubs
6
6
  def self.[](*method_names)
7
- Module.new do
7
+ ::Module.new do
8
8
  method_names.each do |name|
9
9
  define_method(name) do |*|
10
10
  Methods.public_send(name)
@@ -153,5 +153,18 @@ module Dry
153
153
 
154
154
  require "dry/monads/registry"
155
155
  register_mixin(:do, Do::All)
156
+
157
+ if ::Gem::Version.new(::RUBY_VERSION) >= ::Gem::Version.new("3.4.0")
158
+ ::Warning.singleton_class.prepend(::Module.new {
159
+ def warn(message, category: nil)
160
+ if message.include?("lib/dry/monads/do.rb") &&
161
+ message.include?("warning: the block passed to")
162
+ nil
163
+ else
164
+ super
165
+ end
166
+ end
167
+ })
168
+ end
156
169
  end
157
170
  end
@@ -23,7 +23,7 @@ module Dry
23
23
  class ConstructorNotAppliedError < ::NoMethodError
24
24
  def initialize(method_name, constructor_name)
25
25
  super(
26
- "For calling .#{method_name} on #{constructor_name}() build a value "\
26
+ "For calling .#{method_name} on #{constructor_name}() build a value " \
27
27
  "by appending parens: #{constructor_name}()"
28
28
  )
29
29
  end
@@ -13,11 +13,11 @@ module Dry
13
13
 
14
14
  class << self
15
15
  # @private
16
- def new(promise = nil, &block)
16
+ def new(promise = nil, &)
17
17
  if promise
18
18
  super(promise)
19
19
  else
20
- super(Concurrent::Promise.new(executor: :immediate, &block))
20
+ super(Concurrent::Promise.new(executor: :immediate, &))
21
21
  end
22
22
  end
23
23
 
@@ -27,9 +27,7 @@ module Dry
27
27
  # Forces the compution and returns its value.
28
28
  #
29
29
  # @return [Object]
30
- def value!
31
- @promise.execute.value!
32
- end
30
+ def value! = @promise.execute.value!
33
31
  alias_method :force!, :value!
34
32
 
35
33
  # Forces the computation. Note that if the computation
@@ -42,23 +40,22 @@ module Dry
42
40
  end
43
41
 
44
42
  # @return [Boolean]
45
- def evaluated?
46
- @promise.complete?
47
- end
43
+ def evaluated? = @promise.complete?
48
44
  deprecate :complete?, :evaluated?
49
45
 
50
46
  undef_method :wait
51
47
 
52
48
  # @return [String]
53
49
  def to_s
54
- state = case promise.state
55
- when :fulfilled
56
- value!.inspect
57
- when :rejected
58
- "!#{promise.reason.inspect}"
59
- else
60
- "?"
61
- end
50
+ state =
51
+ case promise.state
52
+ when :fulfilled
53
+ value!.inspect
54
+ when :rejected
55
+ "!#{promise.reason.inspect}"
56
+ else
57
+ "?"
58
+ end
62
59
 
63
60
  "Lazy(#{state})"
64
61
  end
@@ -79,9 +76,7 @@ module Dry
79
76
  #
80
77
  # @param block [Proc]
81
78
  # @return [Lazy]
82
- def Lazy(&block)
83
- Lazy.new(&block)
84
- end
79
+ def Lazy(&) = Lazy.new(&)
85
80
  end
86
81
 
87
82
  include Constructors
@@ -9,9 +9,7 @@ module Dry
9
9
  #
10
10
  # @param values [Array<Object>] List elements
11
11
  # @return [List]
12
- def [](*values)
13
- new(values)
14
- end
12
+ def [](*values) = new(values)
15
13
 
16
14
  # Coerces a value to a list. `nil` will be coerced to an empty list.
17
15
  #
@@ -144,9 +142,7 @@ module Dry
144
142
  #
145
143
  # @param other [List] Other list
146
144
  # @return [List]
147
- def +(other)
148
- List.new(to_ary + other.to_ary)
149
- end
145
+ def +(other) = List.new(to_ary + other.to_ary)
150
146
 
151
147
  # Returns a string representation of the list.
152
148
  #
@@ -167,24 +163,18 @@ module Dry
167
163
  # Returns the first element.
168
164
  #
169
165
  # @return [Object]
170
- def first
171
- value.first
172
- end
166
+ def first = value.first
173
167
 
174
168
  # Returns the last element.
175
169
  #
176
170
  # @return [Object]
177
- def last
178
- value.last
179
- end
171
+ def last = value.last
180
172
 
181
173
  # Folds the list from the left.
182
174
  #
183
175
  # @param initial [Object] Initial value
184
176
  # @return [Object]
185
- def fold_left(initial, &block)
186
- value.reduce(initial, &block)
187
- end
177
+ def fold_left(initial, &) = value.reduce(initial, &)
188
178
  alias_method :foldl, :fold_left
189
179
  alias_method :reduce, :fold_left
190
180
 
@@ -200,52 +190,38 @@ module Dry
200
190
  # Whether the list is empty.
201
191
  #
202
192
  # @return [TrueClass, FalseClass]
203
- def empty?
204
- value.empty?
205
- end
193
+ def empty? = value.empty?
206
194
 
207
195
  # Sorts the list.
208
196
  #
209
197
  # @return [List]
210
- def sort
211
- coerce(value.sort)
212
- end
198
+ def sort = coerce(value.sort)
213
199
 
214
200
  # Filters elements with a block
215
201
  #
216
202
  # @return [List]
217
- def filter(&block)
218
- coerce(value.select(&block))
219
- end
203
+ def filter(&) = coerce(value.select(&))
220
204
  alias_method :select, :filter
221
205
 
222
206
  # List size.
223
207
  #
224
208
  # @return [Integer]
225
- def size
226
- value.size
227
- end
209
+ def size = value.size
228
210
 
229
211
  # Reverses the list.
230
212
  #
231
213
  # @return [List]
232
- def reverse
233
- coerce(value.reverse)
234
- end
214
+ def reverse = coerce(value.reverse)
235
215
 
236
216
  # Returns the first element wrapped with a `Maybe`.
237
217
  #
238
218
  # @return [Maybe<Object>]
239
- def head
240
- Monads::Maybe.coerce(value.first)
241
- end
219
+ def head = Monads::Maybe.coerce(value.first)
242
220
 
243
221
  # Returns list's tail.
244
222
  #
245
223
  # @return [List]
246
- def tail
247
- coerce(value.drop(1))
248
- end
224
+ def tail = coerce(value.drop(1))
249
225
 
250
226
  # Turns the list into a typed one.
251
227
  # Type is required for some operations like .traverse.
@@ -258,8 +234,8 @@ module Dry
258
234
  raise ArgumentError, "Cannot infer a monad for an empty list"
259
235
  else
260
236
  self.class.warn(
261
- "Automatic monad inference is deprecated, pass a type explicitly "\
262
- "or use a predefined constant, e.g. List::Result\n"\
237
+ "Automatic monad inference is deprecated, pass a type explicitly " \
238
+ "or use a predefined constant, e.g. List::Result\n" \
263
239
  "#{caller.find { _1 !~ %r{(lib/dry/monads)|(gems)} }}"
264
240
  )
265
241
  self.class.new(value, value[0].monad)
@@ -272,9 +248,7 @@ module Dry
272
248
  # Whether the list is types
273
249
  #
274
250
  # @return [Boolean]
275
- def typed?
276
- !type.nil?
277
- end
251
+ def typed? = !type.nil?
278
252
 
279
253
  # Traverses the list with a block (or without it).
280
254
  # This methods "flips" List structure with the given monad (obtained from the type).
@@ -305,24 +279,20 @@ module Dry
305
279
  #
306
280
  # @param list [List]
307
281
  # @return [List]
308
- def apply(list = Undefined, &block)
309
- v = Undefined.default(list, &block)
282
+ def apply(list = Undefined, &)
283
+ v = Undefined.default(list, &)
310
284
  fmap(Curry).bind { |f| v.fmap { f.(_1) } }
311
285
  end
312
286
 
313
287
  # Returns the List monad.
314
288
  #
315
289
  # @return [Monad]
316
- def monad
317
- List
318
- end
290
+ def monad = List
319
291
 
320
292
  # Returns self.
321
293
  #
322
294
  # @return [List]
323
- def to_monad
324
- self
325
- end
295
+ def to_monad = self
326
296
 
327
297
  # Iterates over the list and collects Some values.
328
298
  #
@@ -367,15 +337,11 @@ module Dry
367
337
  # end
368
338
  #
369
339
  # @api private
370
- def deconstruct
371
- value
372
- end
340
+ def deconstruct = value
373
341
 
374
342
  private
375
343
 
376
- def coerce(other)
377
- self.class.coerce(other)
378
- end
344
+ def coerce(other) = self.class.coerce(other)
379
345
 
380
346
  # Empty list
381
347
  EMPTY = List.new([].freeze).freeze
@@ -388,17 +354,11 @@ module Dry
388
354
 
389
355
  attr_reader :type
390
356
 
391
- def initialize(type)
392
- @type = type
393
- end
357
+ def initialize(type) = @type = type
394
358
 
395
- def [](*args)
396
- List.new(args, type)
397
- end
359
+ def [](*args) = List.new(args, type)
398
360
 
399
- def coerce(value)
400
- List.coerce(value, type)
401
- end
361
+ def coerce(value) = List.coerce(value, type)
402
362
 
403
363
  def pure(val = Undefined, &block)
404
364
  value = Undefined.default(val, block)
@@ -433,9 +393,7 @@ module Dry
433
393
 
434
394
  # List constructor.
435
395
  # @return [List]
436
- def List(value)
437
- List.coerce(value)
438
- end
396
+ def List(value) = List.coerce(value)
439
397
  end
440
398
  end
441
399
 
@@ -46,38 +46,28 @@ module Dry
46
46
  end
47
47
 
48
48
  # Returns true for an instance of a {Maybe::None} monad.
49
- def none?
50
- is_a?(None)
51
- end
49
+ def none? = is_a?(None)
52
50
  alias_method :failure?, :none?
53
51
 
54
52
  # Returns true for an instance of a {Maybe::Some} monad.
55
- def some?
56
- is_a?(Some)
57
- end
53
+ def some? = is_a?(Some)
58
54
  alias_method :success?, :some?
59
55
 
60
56
  # Returns self, added to keep the interface compatible with that of Either monad types.
61
57
  #
62
58
  # @return [Maybe::Some, Maybe::None]
63
- def to_maybe
64
- self
65
- end
59
+ def to_maybe = self
66
60
 
67
61
  # Returns self.
68
62
  #
69
63
  # @return [Maybe::Some, Maybe::None]
70
- def to_monad
71
- self
72
- end
64
+ def to_monad = self
73
65
 
74
66
  # Returns the Maybe monad.
75
67
  # This is how we're doing polymorphism in Ruby 😕
76
68
  #
77
69
  # @return [Monad]
78
- def monad
79
- Maybe
80
- end
70
+ def monad = Maybe
81
71
 
82
72
  # Represents a value that is present, i.e. not nil.
83
73
  #
@@ -96,9 +86,7 @@ module Dry
96
86
  # end
97
87
  #
98
88
  # @api public
99
- def self.[](*value)
100
- new(value)
101
- end
89
+ def self.[](*value) = new(value)
102
90
 
103
91
  def initialize(value = Undefined)
104
92
  raise ArgumentError, "nil cannot be some" if value.nil?
@@ -124,11 +112,11 @@ module Dry
124
112
  if next_value.nil?
125
113
  if self.class.warn_on_implicit_nil_coercion
126
114
  Core::Deprecations.warn(
127
- "Block passed to Some#fmap returned `nil` and was chained to None. "\
128
- "This is literally an unlawful behavior and it will not be supported in "\
129
- "dry-monads 2. \nPlease, replace `.fmap` with `.maybe` in places where you "\
130
- "expect `nil` as block result.\n"\
131
- "You can opt out of these warnings with\n"\
115
+ "Block passed to Some#fmap returned `nil` and was chained to None. " \
116
+ "This is literally an unlawful behavior and it will not be supported in " \
117
+ "dry-monads 2. \nPlease, replace `.fmap` with `.maybe` in places where you " \
118
+ "expect `nil` as block result.\n" \
119
+ "You can opt out of these warnings with\n" \
132
120
  "Dry::Monads::Maybe.warn_on_implicit_nil_coercion false",
133
121
  uplevel: 0,
134
122
  tag: :"dry-monads"
@@ -151,9 +139,7 @@ module Dry
151
139
  # @param args [Array<Object>] arguments will be transparently passed through to #bind
152
140
  # @return [Maybe::Some, Maybe::None] Wrapped result, i.e. nil will be mapped to None,
153
141
  # other values will be wrapped with Some
154
- def maybe(...)
155
- Maybe.coerce(bind(...))
156
- end
142
+ def maybe(...) = Maybe.coerce(bind(...))
157
143
 
158
144
  # Accepts a block and runs it against the wrapped value.
159
145
  # If the block returns a trurhy value the result is self,
@@ -246,26 +232,19 @@ module Dry
246
232
  # @param args [Array<Object>] arguments will be passed to the underlying `#or` call
247
233
  # @return [Maybe::Some, Maybe::None] Lifted `#or` result, i.e. nil will be mapped to None,
248
234
  # other values will be wrapped with Some
249
- def or_fmap(...)
250
- Maybe.coerce(self.or(...))
251
- end
235
+ def or_fmap(...) = Maybe.coerce(self.or(...))
252
236
 
253
237
  # @return [String]
254
- def to_s
255
- "None"
256
- end
238
+ def to_s = "None"
257
239
  alias_method :inspect, :to_s
258
240
 
259
241
  # @api private
260
- def eql?(other)
261
- other.is_a?(None)
262
- end
242
+ def eql?(other) = other.is_a?(None)
243
+
263
244
  alias_method :==, :eql?
264
245
 
265
246
  # @private
266
- def hash
267
- None.instance.object_id
268
- end
247
+ def hash = None.instance.object_id
269
248
 
270
249
  # Pattern matching
271
250
  #
@@ -277,16 +256,12 @@ module Dry
277
256
  # end
278
257
  #
279
258
  # @api private
280
- def deconstruct
281
- EMPTY_ARRAY
282
- end
259
+ def deconstruct = EMPTY_ARRAY
283
260
 
284
261
  # @see Maybe::Some#filter
285
262
  #
286
263
  # @return [Maybe::None]
287
- def filter(_ = Undefined)
288
- self
289
- end
264
+ def filter(_ = Undefined) = self
290
265
  end
291
266
 
292
267
  # A module that can be included for easier access to Maybe monads.
@@ -302,9 +277,7 @@ module Dry
302
277
  module Constructors
303
278
  # @param value [Object] the value to be stored in the monad
304
279
  # @return [Maybe::Some, Maybe::None]
305
- def Maybe(value)
306
- Maybe.coerce(value)
307
- end
280
+ def Maybe(value) = Maybe.coerce(value)
308
281
 
309
282
  # Some constructor
310
283
  #
@@ -322,9 +295,7 @@ module Dry
322
295
  end
323
296
 
324
297
  # @return [Maybe::None]
325
- def None
326
- None.new(RightBiased::Left.trace_caller)
327
- end
298
+ def None = None.new(RightBiased::Left.trace_caller)
328
299
  end
329
300
 
330
301
  include Constructors
@@ -393,9 +364,7 @@ module Dry
393
364
 
394
365
  class Failure < Result
395
366
  # @return [Maybe::None]
396
- def to_maybe
397
- Maybe::None.new(trace)
398
- end
367
+ def to_maybe = Maybe::None.new(trace)
399
368
  end
400
369
  end
401
370
 
@@ -415,16 +384,12 @@ module Dry
415
384
  class Try
416
385
  class Value < Try
417
386
  # @return [Maybe]
418
- def to_maybe
419
- Dry::Monads::Maybe(@value)
420
- end
387
+ def to_maybe = ::Dry::Monads::Maybe(@value)
421
388
  end
422
389
 
423
390
  class Error < Try
424
391
  # @return [Maybe::None]
425
- def to_maybe
426
- Maybe::None.new(RightBiased::Left.trace_caller)
427
- end
392
+ def to_maybe = Maybe::None.new(RightBiased::Left.trace_caller)
428
393
  end
429
394
  end
430
395
 
@@ -433,18 +398,14 @@ module Dry
433
398
  # Converts to Maybe::Some
434
399
  #
435
400
  # @return [Maybe::Some]
436
- def to_maybe
437
- Maybe.pure(value!)
438
- end
401
+ def to_maybe = Maybe.pure(value!)
439
402
  end
440
403
 
441
404
  class Invalid < Validated
442
405
  # Converts to Maybe::None
443
406
  #
444
407
  # @return [Maybe::None]
445
- def to_maybe
446
- Maybe::None.new(RightBiased::Left.trace_caller)
447
- end
408
+ def to_maybe = Maybe::None.new(RightBiased::Left.trace_caller)
448
409
  end
449
410
  end
450
411
 
@@ -43,9 +43,7 @@ module Dry
43
43
  end
44
44
 
45
45
  # @private
46
- def known_monads
47
- @constants.keys
48
- end
46
+ def known_monads = @constants.keys
49
47
 
50
48
  # @private
51
49
  def load_monad(name)
@@ -59,15 +57,13 @@ module Dry
59
57
 
60
58
  # @private
61
59
  def constructors
62
- @constructors ||= registry.values.filter_map { |m|
60
+ @constructors ||= registry.values.filter_map do |m|
63
61
  m::Constructors if m.const_defined?(:Constructors)
64
- }
62
+ end
65
63
  end
66
64
 
67
65
  # @private
68
- def all_loaded?
69
- registry.size.eql?(@constants.size)
70
- end
66
+ def all_loaded? = registry.size.eql?(@constants.size)
71
67
  end
72
68
  end
73
69
  end
@@ -8,11 +8,9 @@ module Dry
8
8
  # @see Monads#Result
9
9
  # @private
10
10
  class Fixed < ::Module
11
- def self.[](error, **options)
12
- new(error, **options)
13
- end
11
+ def self.[](error, **options) = new(error, **options)
14
12
 
15
- def initialize(error, **_options)
13
+ def initialize(error, **)
16
14
  super()
17
15
 
18
16
  @mod = ::Module.new do