dry-core 0.7.1 → 1.0.1
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 +69 -1
- data/LICENSE +1 -1
- data/README.md +4 -12
- data/dry-core.gemspec +3 -2
- data/lib/dry/core/basic_object.rb +144 -0
- data/lib/dry/core/cache.rb +2 -2
- data/lib/dry/core/class_attributes.rb +2 -4
- data/lib/dry/core/constants.rb +1 -1
- data/lib/dry/core/container/config.rb +34 -0
- data/lib/dry/core/container/configuration.rb +37 -0
- data/lib/dry/core/container/item/callable.rb +22 -0
- data/lib/dry/core/container/item/factory.rb +29 -0
- data/lib/dry/core/container/item/memoizable.rb +49 -0
- data/lib/dry/core/container/item.rb +53 -0
- data/lib/dry/core/container/mixin.rb +311 -0
- data/lib/dry/core/container/namespace.rb +47 -0
- data/lib/dry/core/container/namespace_dsl.rb +63 -0
- data/lib/dry/core/container/registry.rb +52 -0
- data/lib/dry/core/container/resolver.rb +90 -0
- data/lib/dry/core/container/stub.rb +57 -0
- data/lib/dry/core/container.rb +27 -0
- data/lib/dry/core/deprecations.rb +1 -1
- data/lib/dry/core/equalizer.rb +15 -11
- data/lib/dry/core/errors.rb +1 -1
- data/lib/dry/core/memoizable.rb +57 -14
- data/lib/dry/core/version.rb +1 -1
- data/lib/dry/core.rb +46 -0
- metadata +33 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c263a2d5bf720ac7d9e68c202b3552e4e82bba0b253ddc75a1aff5055463f9a
|
4
|
+
data.tar.gz: 955cdffe644913ba567129a73aaf3ea0b748b2b2fd5244b5d559da013bd05df9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da527ac6a598046f9c8c7c2c1264b3e18c979b2ca5c2df65a6709952a3238afe733e3c52e92e0322946c46ff7b54141d986e2cdfe41ad5c0ae125bc96ad52c80
|
7
|
+
data.tar.gz: 64a8f1688c6781b2a10f3157747f8130c59072be29ed9b238500700166bb9c8e5d4b30e8a5493407c8354f71fd83d246dd3b9f9778dda6c23105dedcb209ae92
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,73 @@
|
|
1
1
|
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
+
## 1.0.1 2023-08-06
|
4
|
+
|
5
|
+
|
6
|
+
### Fixed
|
7
|
+
|
8
|
+
- [equalizer] Add `Dry::Core.Equalizer` method to make `include Dry::Core.Equalizer(...)` work as documented (via #79) (@timriley)
|
9
|
+
|
10
|
+
Users of Equalizer should now only need to `require "dry/core"` first.
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
[Compare v1.0.0...v1.0.1](https://github.com/dry-rb/dry-core/compare/v1.0.0...v1.0.1)
|
15
|
+
|
16
|
+
## 1.0.0 2022-11-04
|
17
|
+
|
18
|
+
|
19
|
+
### Added
|
20
|
+
|
21
|
+
- Import dry-container as `Dry::Core::Container` (via #77) (@solnic)
|
22
|
+
|
23
|
+
|
24
|
+
[Compare v0.9.1...v1.0.0](https://github.com/dry-rb/dry-core/compare/v0.9.1...v1.0.0)
|
25
|
+
|
26
|
+
## 0.9.1 2022-10-18
|
27
|
+
|
28
|
+
|
29
|
+
### Changed
|
30
|
+
|
31
|
+
- Correct missing constant for IDENTITY (issue #75 fixed via #76) (@poloka)
|
32
|
+
|
33
|
+
[Compare v0.9.0...v0.9.1](https://github.com/dry-rb/dry-core/compare/v0.9.0...v0.9.1)
|
34
|
+
|
35
|
+
## 0.9.0 2022-10-15
|
36
|
+
|
37
|
+
|
38
|
+
### Changed
|
39
|
+
|
40
|
+
- dry-core now uses zeitwerk for autoloading (@solnic)
|
41
|
+
|
42
|
+
[Compare v0.8.1...v0.9.0](https://github.com/dry-rb/dry-core/compare/v0.8.1...v0.9.0)
|
43
|
+
|
44
|
+
## 0.8.1 2022-07-27
|
45
|
+
|
46
|
+
|
47
|
+
### Fixed
|
48
|
+
|
49
|
+
- [memoizable] plays better with inheritance.
|
50
|
+
There were cases when cached values from base claesses were used, see #70 (@flash-gordon)
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
[Compare v0.8.0...v0.8.1](https://github.com/dry-rb/dry-core/compare/v0.8.0...v0.8.1)
|
55
|
+
|
56
|
+
## 0.8.0 2022-07-15
|
57
|
+
|
58
|
+
|
59
|
+
### Added
|
60
|
+
|
61
|
+
- `Dry::Core::BasicObject` ported from hanami-utils (@jodosha)
|
62
|
+
|
63
|
+
### Changed
|
64
|
+
|
65
|
+
- [BREAKING] [descendants tracker] switch to using `Class#subclasses` on Ruby 3.1+.
|
66
|
+
This changes the order of returned subclasses (immediate subclasses now go first) (@flash-gordon)
|
67
|
+
|
68
|
+
|
69
|
+
[Compare v0.7.1...v0.8.0](https://github.com/dry-rb/dry-core/compare/v0.7.1...v0.8.0)
|
70
|
+
|
3
71
|
## 0.7.1 2021-07-10
|
4
72
|
|
5
73
|
|
@@ -43,7 +111,7 @@ has unnamed params (e.g. happens when the new `...` syntax is used) (@flash-gord
|
|
43
111
|
|
44
112
|
[Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-core/compare/v0.5.0...v0.6.0)
|
45
113
|
|
46
|
-
## 0.5.0
|
114
|
+
## 0.5.0 2020-12-12
|
47
115
|
|
48
116
|
|
49
117
|
### Added
|
data/LICENSE
CHANGED
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-core
|
3
3
|
[actions]: https://github.com/dry-rb/dry-core/actions
|
4
|
-
[codacy]: https://www.codacy.com/gh/dry-rb/dry-core
|
5
|
-
[chat]: https://dry-rb.zulipchat.com
|
6
|
-
[inchpages]: http://inch-ci.org/github/dry-rb/dry-core
|
7
4
|
|
8
|
-
# dry-core [][gem]
|
11
|
-
[][actions]
|
12
|
-
[][codacy]
|
13
|
-
[][codacy]
|
14
|
-
[][inchpages]
|
5
|
+
# dry-core [][gem] [][actions]
|
15
6
|
|
16
7
|
## Links
|
17
8
|
|
18
9
|
* [User documentation](https://dry-rb.org/gems/dry-core)
|
19
10
|
* [API documentation](http://rubydoc.info/gems/dry-core)
|
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 `>=
|
26
|
-
*
|
17
|
+
* MRI `>= 3.0.0`
|
18
|
+
* jruby `>= 9.4` (not tested on CI)
|
27
19
|
|
28
20
|
## License
|
29
21
|
|
data/dry-core.gemspec
CHANGED
@@ -22,14 +22,15 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
24
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
25
|
-
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/
|
25
|
+
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md"
|
26
26
|
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-core"
|
27
27
|
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-core/issues"
|
28
28
|
|
29
|
-
spec.required_ruby_version = ">=
|
29
|
+
spec.required_ruby_version = ">= 3.0.0"
|
30
30
|
|
31
31
|
# to update dependencies edit project.yml
|
32
32
|
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
|
33
|
+
spec.add_runtime_dependency "zeitwerk", "~> 2.6"
|
33
34
|
|
34
35
|
spec.add_development_dependency "bundler"
|
35
36
|
spec.add_development_dependency "rake"
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This implementation was imported from `hanami-utils` gem.
|
4
|
+
module Dry
|
5
|
+
module Core
|
6
|
+
# BasicObject
|
7
|
+
#
|
8
|
+
# @since 0.8.0
|
9
|
+
class BasicObject < ::BasicObject
|
10
|
+
# Lookups constants at the top-level namespace, if they are missing in the
|
11
|
+
# current context.
|
12
|
+
#
|
13
|
+
# @param name [Symbol] the constant name
|
14
|
+
#
|
15
|
+
# @return [Object, Module] the constant
|
16
|
+
#
|
17
|
+
# @raise [NameError] if the constant cannot be found
|
18
|
+
#
|
19
|
+
# @since 0.8.0
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @see https://ruby-doc.org/core/Module.html#method-i-const_missing
|
23
|
+
def self.const_missing(name)
|
24
|
+
::Object.const_get(name)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the class for debugging purposes.
|
28
|
+
#
|
29
|
+
# @since 0.8.0
|
30
|
+
#
|
31
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-class
|
32
|
+
def class
|
33
|
+
(class << self; self; end).superclass
|
34
|
+
end
|
35
|
+
|
36
|
+
# Bare minimum inspect for debugging purposes.
|
37
|
+
#
|
38
|
+
# @return [String] the inspect string
|
39
|
+
#
|
40
|
+
# @since 0.8.0
|
41
|
+
#
|
42
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-inspect
|
43
|
+
inspect_method = ::Kernel.instance_method(:inspect)
|
44
|
+
define_method(:inspect) do
|
45
|
+
original = inspect_method.bind_call(self)
|
46
|
+
"#{original[0...-1]}#{__inspect}>"
|
47
|
+
end
|
48
|
+
|
49
|
+
# @!macro [attach] instance_of?(class)
|
50
|
+
#
|
51
|
+
# Determines if self is an instance of given class or module
|
52
|
+
#
|
53
|
+
# @param class [Class,Module] the class of module to verify
|
54
|
+
#
|
55
|
+
# @return [TrueClass,FalseClass] the result of the check
|
56
|
+
#
|
57
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
58
|
+
#
|
59
|
+
# @since 0.8.0
|
60
|
+
#
|
61
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-instance_of-3F
|
62
|
+
define_method :instance_of?, ::Object.instance_method(:instance_of?)
|
63
|
+
|
64
|
+
# @!macro [attach] is_a?(class)
|
65
|
+
#
|
66
|
+
# Determines if self is of the type of the object class or module
|
67
|
+
#
|
68
|
+
# @param class [Class,Module] the class of module to verify
|
69
|
+
#
|
70
|
+
# @return [TrueClass,FalseClass] the result of the check
|
71
|
+
#
|
72
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
73
|
+
#
|
74
|
+
# @since 0.8.0
|
75
|
+
#
|
76
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-is_a-3F
|
77
|
+
define_method :is_a?, ::Object.instance_method(:is_a?)
|
78
|
+
|
79
|
+
# @!macro [attach] kind_of?(class)
|
80
|
+
#
|
81
|
+
# Determines if self is of the kind of the object class or module
|
82
|
+
#
|
83
|
+
# @param class [Class,Module] the class of module to verify
|
84
|
+
#
|
85
|
+
# @return [TrueClass,FalseClass] the result of the check
|
86
|
+
#
|
87
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
88
|
+
#
|
89
|
+
# @since 0.8.0
|
90
|
+
#
|
91
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-kind_of-3F
|
92
|
+
define_method :kind_of?, ::Object.instance_method(:kind_of?)
|
93
|
+
|
94
|
+
# Alias for __id__
|
95
|
+
#
|
96
|
+
# @return [Fixnum] the object id
|
97
|
+
#
|
98
|
+
# @since 0.8.0
|
99
|
+
#
|
100
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-object_id
|
101
|
+
def object_id
|
102
|
+
__id__
|
103
|
+
end
|
104
|
+
|
105
|
+
# Interface for pp
|
106
|
+
#
|
107
|
+
# @param printer [PP] the Pretty Printable printer
|
108
|
+
# @return [String] the pretty-printable inspection of the object
|
109
|
+
#
|
110
|
+
# @since 0.8.0
|
111
|
+
#
|
112
|
+
# @see https://ruby-doc.org/stdlib/libdoc/pp/rdoc/PP.html
|
113
|
+
def pretty_print(printer)
|
114
|
+
printer.text(inspect)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Returns true if responds to the given method.
|
118
|
+
#
|
119
|
+
# @return [TrueClass,FalseClass] the result of the check
|
120
|
+
#
|
121
|
+
# @since 0.8.0
|
122
|
+
#
|
123
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-respond_to-3F
|
124
|
+
def respond_to?(method_name, include_all = false) # rubocop:disable Style/OptionalBooleanParameter
|
125
|
+
respond_to_missing?(method_name, include_all)
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
# Must be overridden by descendants
|
131
|
+
#
|
132
|
+
# @since 0.8.0
|
133
|
+
# @api private
|
134
|
+
def respond_to_missing?(_method_name, _include_all)
|
135
|
+
::Kernel.raise ::NotImplementedError
|
136
|
+
end
|
137
|
+
|
138
|
+
# @since 0.8.0
|
139
|
+
# @api private
|
140
|
+
def __inspect # rubocop:disable Style/EmptyMethod
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/lib/dry/core/cache.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "dry/core/constants"
|
4
|
-
require "dry/core/errors"
|
5
4
|
|
6
5
|
module Dry
|
7
6
|
module Core
|
@@ -10,7 +9,6 @@ module Dry
|
|
10
9
|
# @api public
|
11
10
|
module ClassAttributes
|
12
11
|
include Constants
|
13
|
-
|
14
12
|
# Specify what attributes a class will use
|
15
13
|
#
|
16
14
|
# @example
|
@@ -80,13 +78,13 @@ module Dry
|
|
80
78
|
if Undefined.equal?(value)
|
81
79
|
if instance_variable_defined?(ivar)
|
82
80
|
instance_variable_get(ivar)
|
83
|
-
else
|
81
|
+
else
|
84
82
|
nil
|
85
83
|
end
|
86
84
|
elsif type === value # rubocop:disable Style/CaseEquality
|
87
85
|
instance_variable_set(ivar, coerce.call(value))
|
88
86
|
else
|
89
|
-
raise
|
87
|
+
raise InvalidClassAttributeValueError.new(name, value)
|
90
88
|
end
|
91
89
|
end
|
92
90
|
end
|
data/lib/dry/core/constants.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
# @api public
|
7
|
+
class Config
|
8
|
+
DEFAULT_NAMESPACE_SEPARATOR = "."
|
9
|
+
DEFAULT_RESOLVER = Resolver.new
|
10
|
+
DEFAULT_REGISTRY = Registry.new
|
11
|
+
|
12
|
+
# @api public
|
13
|
+
attr_accessor :namespace_separator
|
14
|
+
|
15
|
+
# @api public
|
16
|
+
attr_accessor :resolver
|
17
|
+
|
18
|
+
# @api public
|
19
|
+
attr_accessor :registry
|
20
|
+
|
21
|
+
# @api private
|
22
|
+
def initialize(
|
23
|
+
namespace_separator: DEFAULT_NAMESPACE_SEPARATOR,
|
24
|
+
resolver: DEFAULT_RESOLVER,
|
25
|
+
registry: DEFAULT_REGISTRY
|
26
|
+
)
|
27
|
+
@namespace_separator = namespace_separator
|
28
|
+
@resolver = resolver
|
29
|
+
@registry = registry
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
# @api public
|
7
|
+
module Configuration
|
8
|
+
# Use dry/configurable if it's available
|
9
|
+
begin
|
10
|
+
require "dry/configurable"
|
11
|
+
|
12
|
+
# @api private
|
13
|
+
def self.extended(klass)
|
14
|
+
super
|
15
|
+
klass.class_eval do
|
16
|
+
extend Dry::Configurable
|
17
|
+
|
18
|
+
setting :namespace_separator, default: Config::DEFAULT_NAMESPACE_SEPARATOR
|
19
|
+
setting :resolver, default: Config::DEFAULT_RESOLVER
|
20
|
+
setting :registry, default: Config::DEFAULT_REGISTRY
|
21
|
+
end
|
22
|
+
end
|
23
|
+
rescue LoadError
|
24
|
+
# @api private
|
25
|
+
def config
|
26
|
+
@config ||= Container::Config.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# @api private
|
31
|
+
def configure
|
32
|
+
yield config
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
class Item
|
7
|
+
# Callable class to returns a item call
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
#
|
11
|
+
class Callable < Item
|
12
|
+
# Returns the result of item call or item
|
13
|
+
#
|
14
|
+
# @return [Mixed]
|
15
|
+
def call
|
16
|
+
callable? ? item.call : item
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
class Item
|
7
|
+
# Factory for create an Item to register inside of container
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
class Factory
|
11
|
+
# Creates an Item Memoizable or Callable
|
12
|
+
# @param [Mixed] item
|
13
|
+
# @param [Hash] options
|
14
|
+
#
|
15
|
+
# @raise [Dry::Core::Container::Error]
|
16
|
+
#
|
17
|
+
# @return [Dry::Core::Container::Item::Base]
|
18
|
+
def call(item, options = {})
|
19
|
+
if options[:memoize]
|
20
|
+
Item::Memoizable.new(item, options)
|
21
|
+
else
|
22
|
+
Item::Callable.new(item, options)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
class Item
|
7
|
+
# Memoizable class to store and execute item calls
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
#
|
11
|
+
class Memoizable < Item
|
12
|
+
# @return [Mutex] the stored mutex
|
13
|
+
attr_reader :memoize_mutex
|
14
|
+
|
15
|
+
# Returns a new Memoizable instance
|
16
|
+
#
|
17
|
+
# @param [Mixed] item
|
18
|
+
# @param [Hash] options
|
19
|
+
#
|
20
|
+
# @raise [Dry::Core::Container::Error]
|
21
|
+
#
|
22
|
+
# @return [Dry::Core::Container::Item::Base]
|
23
|
+
def initialize(item, options = {})
|
24
|
+
super
|
25
|
+
raise_not_supported_error unless callable?
|
26
|
+
|
27
|
+
@memoize_mutex = ::Mutex.new
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the result of item call using a syncronized mutex
|
31
|
+
#
|
32
|
+
# @return [Dry::Core::Container::Item::Base]
|
33
|
+
def call
|
34
|
+
memoize_mutex.synchronize do
|
35
|
+
@memoized_item ||= item.call
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# @private
|
42
|
+
def raise_not_supported_error
|
43
|
+
raise ::Dry::Core::Container::Error, "Memoize only supported for a block or a proc"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Dry
|
4
|
+
module Core
|
5
|
+
class Container
|
6
|
+
# Base class to abstract Memoizable and Callable implementations
|
7
|
+
#
|
8
|
+
# @api abstract
|
9
|
+
#
|
10
|
+
class Item
|
11
|
+
# @return [Mixed] the item to be solved later
|
12
|
+
attr_reader :item
|
13
|
+
|
14
|
+
# @return [Hash] the options to memoize, call or no.
|
15
|
+
attr_reader :options
|
16
|
+
|
17
|
+
# @api abstract
|
18
|
+
def initialize(item, options = {})
|
19
|
+
@item = item
|
20
|
+
@options = {
|
21
|
+
call: item.is_a?(::Proc) && item.parameters.empty?
|
22
|
+
}.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @api abstract
|
26
|
+
def call
|
27
|
+
raise NotImplementedError
|
28
|
+
end
|
29
|
+
|
30
|
+
# @private
|
31
|
+
def value?
|
32
|
+
!callable?
|
33
|
+
end
|
34
|
+
|
35
|
+
# @private
|
36
|
+
def callable?
|
37
|
+
options[:call]
|
38
|
+
end
|
39
|
+
|
40
|
+
# Build a new item with transformation applied
|
41
|
+
#
|
42
|
+
# @private
|
43
|
+
def map(func)
|
44
|
+
if callable?
|
45
|
+
self.class.new(-> { func.(item.call) }, options)
|
46
|
+
else
|
47
|
+
self.class.new(func.(item), options)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|