ryo.rb 0.5.3 → 0.5.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b39f30dc20ead80a6704d27f1a10b9046ad6fe05d164ec4cb31b6606f225a33
4
- data.tar.gz: 03db26bce85e7f1fad10d2b909284c32fc18f13cd999aa718ddd21d867d29a29
3
+ metadata.gz: ae979c4fc47c5c25d26b0c215807a7ebd867dc5abd596277dda692c36c5c3445
4
+ data.tar.gz: 3cf89103180d9d6280698b93520eb80dc9af2e3ff4cbebb84c54b1089bed12e6
5
5
  SHA512:
6
- metadata.gz: 95f73de92d97038eb2ef3c70c4fb97e02c84a0ed5fe9a7d73f198f392f4a04ca608170ab2011f537bac9779cb66c7214a1166040268d602aa592a540789e24e8
7
- data.tar.gz: 51809089becfa72d4cadf79771cd944f1d31e8d658d03f4d00881c6d7eec6dbd58448cbabe3efada8e386a55c96b5298fb47470f76c125179ecf35ad9d1ddb1b
6
+ metadata.gz: 795a2ab471038483d47fa39103996ec756da3437098b27091bb3b6e1f6534202ebc508e33f8d38bda4dfee8ae835465947da0c8adb2c13805480f13b4f54f4fe
7
+ data.tar.gz: edd4fd919629134e9479a91469084dbbdaf5507ce6aef91b7e1779720bff76ad1aec675dd31de42a05c7a8375d4c0ca27ce5aba260059b18fa526ec755bc7a0a
@@ -12,7 +12,7 @@ jobs:
12
12
  fail-fast: false
13
13
  matrix:
14
14
  os: [ubuntu-latest]
15
- ruby: [3.1, 3.2, 3.3]
15
+ ruby: [3.2, 3.3]
16
16
  runs-on: ${{ matrix.os }}
17
17
  steps:
18
18
  - uses: actions/checkout@v2
@@ -20,4 +20,4 @@ jobs:
20
20
  with:
21
21
  ruby-version: ${{ matrix.ruby }}
22
22
  - run: bundle install
23
- - run: bundle exec rspec
23
+ - run: rake ci
data/README.md CHANGED
@@ -16,6 +16,7 @@ method seen in the example returns an instance of
16
16
  [Ryo::Object](https://0x1eef.github.io/x/ryo.rb/Ryo/Object.html):
17
17
 
18
18
  ```ruby
19
+ #!/usr/bin/env ruby
19
20
  require "ryo"
20
21
 
21
22
  point_x = Ryo(x: 5)
@@ -35,6 +36,7 @@ will bind its `self` to the Ryo object it is assigned to, and when the function
35
36
  is called it will have access to the properties of the Ryo object:
36
37
 
37
38
  ```ruby
39
+ #!/usr/bin/env ruby
38
40
  require "ryo"
39
41
 
40
42
  point_x = Ryo(x: 5)
@@ -56,6 +58,7 @@ The following example demonstrates
56
58
  accessed for the first time. It is similar to a Ryo function:
57
59
 
58
60
  ```ruby
61
+ #!/usr/bin/env ruby
59
62
  require "ryo"
60
63
 
61
64
  point_x = Ryo(x: Ryo.memo { 5 })
@@ -87,6 +90,7 @@ is not implemented directly on a Ryo object.
87
90
  A demonstration of [`Ryo.each`](https://0x1eef.github.io/x/ryo.rb/Ryo.html#each-class_method):
88
91
 
89
92
  ```ruby
93
+ #!/usr/bin/env ruby
90
94
  require "ryo"
91
95
 
92
96
  point = Ryo(x: 10, y: 20)
@@ -115,6 +119,7 @@ and it returns a new copy of a Ryo object and its prototypes.
115
119
  A demonstration of [`Ryo.map!`](http://0x1eef.github.io/x/ryo.rb/Ryo/Enumerable.html#map!-instance_method):
116
120
 
117
121
  ```ruby
122
+ #!/usr/bin/env ruby
118
123
  require "ryo"
119
124
 
120
125
  point_x = Ryo(x: 2)
@@ -148,6 +153,7 @@ demonstrates using the `ancestors` option with
148
153
  [`Ryo.find`](https://0x1eef.github.io/x/ryo.rb/Ryo.html#find-class_method):
149
154
 
150
155
  ```ruby
156
+ #!/usr/bin/env ruby
151
157
  require "ryo"
152
158
 
153
159
  point_x = Ryo(x: 5)
@@ -174,6 +180,7 @@ very large - otherwise there shouldn't be a noticeable performance impact.
174
180
  The following example demonstrates [`Ryo.from`](https://0x1eef.github.io/x/ryo.rb/Ryo.html#from-class_method):
175
181
 
176
182
  ```ruby
183
+ #!/usr/bin/env ruby
177
184
  require "ryo"
178
185
 
179
186
  point = Ryo.from({
@@ -194,6 +201,7 @@ An object that can't be turned into a Ryo object is left as-is. The following
194
201
  example demonstrates how that works in practice:
195
202
 
196
203
  ``` ruby
204
+ #!/usr/bin/env ruby
197
205
  require "ryo"
198
206
 
199
207
  points = Ryo.from([
@@ -221,6 +229,7 @@ can recursively turn an OpenStruct object into Ryo objects. The example also ass
221
229
  a prototype to the Ryo object created from the OpenStruct:
222
230
 
223
231
  ``` ruby
232
+ #!/usr/bin/env ruby
224
233
  require "ryo"
225
234
  require "ostruct"
226
235
 
@@ -246,6 +255,7 @@ with fewer methods. The following example demonstrates
246
255
  how to create an instance of [Ryo::BasicObject](https://0x1eef.github.io/x/ryo.rb/Ryo/BasicObject.html):
247
256
 
248
257
  ```ruby
258
+ #!/usr/bin/env ruby
249
259
  require "ryo"
250
260
 
251
261
  point_x = Ryo::BasicObject(x: 0)
@@ -265,6 +275,7 @@ it returns instance(s) of [Ryo::BasicObject](https://0x1eef.github.io/x/ryo.rb/R
265
275
  instead:
266
276
 
267
277
  ```ruby
278
+ #!/usr/bin/env ruby
268
279
  require "ryo"
269
280
 
270
281
  point = Ryo::BasicObject.from({
@@ -281,18 +292,21 @@ p [point.x.to_i, point.y.to_i]
281
292
 
282
293
  #### Resolution strategy
283
294
 
284
- When a property and method collide, Ryo tries to find the best resolution. Since Ryo properties
285
- don't accept arguments, and methods can - we are able to distinguish a property from a method in
286
- many cases.
287
-
288
- Consider this example, where a property collides with the `Kernel#then` method. This example
289
- would work the same for other methods that accept a block and/or arguments:
295
+ When a property and method collide, Ryo tries to
296
+ find the best resolution. Since Ryo properties don't
297
+ accept arguments, and methods can - we are able to
298
+ distinguish a method from a Ryo property by the presence
299
+ or absence of an argument. Consider the following example,
300
+ where a property collides with the `Kernel#then` method:
290
301
 
291
302
  ```ruby
303
+ #!/usr/bin/env ruby
292
304
  require "ryo"
293
305
 
294
306
  ryo = Ryo::Object(then: 12)
307
+ # Resolves to Ryo property
295
308
  p ryo.then # => 12
309
+ # Resolves to Kernel#then
296
310
  p ryo.then { 34 } # => 34
297
311
  ```
298
312
 
@@ -300,20 +314,22 @@ p ryo.then { 34 } # => 34
300
314
 
301
315
  #### Duck typing
302
316
 
303
- The documentation has used simple terms to describe the objects that Ryo works
304
- with: Hash and Array objects. But in reality, Ryo uses duck typing, so any object
305
- that implements `#each_pair` can be treated as a Hash object, and any object that
306
- implements `#each` can be treated as an Array object. Note that only
317
+ The documentation has used simple terms to describe
318
+ the objects that Ryo works with: Hash and Array objects.
319
+ But that doesn't quite capture the fact that Ryo
320
+ uses duck typing: any object that implements `#each_pair`
321
+ is similar to a Hash, and any object that implements
322
+ `#each` is similar to an Array. Note that only
307
323
  [Ryo.from](https://0x1eef.github.io/x/ryo.rb/Ryo.html#from-class_method),
308
324
  [Ryo::Object.from](https://0x1eef.github.io/x/ryo.rb/Ryo/Object.html#from-class_method)
309
325
  and
310
326
  [Ryo::BasicObject.from](https://0x1eef.github.io/x/ryo.rb/Ryo/BasicObject.html#from-class_method)
311
- can handle Array/#each objects.
327
+ can handle Array-like objects.
312
328
 
313
- Here's an example of how to turn your own custom object, which implements
314
- `#each_pair`, into a Ryo object:
329
+ The following example implements `#each_pair`:
315
330
 
316
331
  ``` ruby
332
+ #!/usr/bin/env ruby
317
333
  require "ryo"
318
334
 
319
335
  class Point
@@ -353,7 +369,7 @@ Ryo can be installed via rubygems.org:
353
369
 
354
370
  Thanks to
355
371
  [@awfulcooking (mooff)](https://github.com/awfulcooking)
356
- for the helpful discussions, ideas, and advice
372
+ for the helpful discussions
357
373
 
358
374
  ## License
359
375
 
data/Rakefile.rb ADDED
@@ -0,0 +1,13 @@
1
+ require "bundler/setup"
2
+
3
+ desc "Run CI tasks"
4
+ task :ci do
5
+ sh "bundle exec rubocop"
6
+ sh "bundle exec rspec spec/"
7
+ end
8
+
9
+ desc "Run tests"
10
+ task :test do
11
+ sh "bundle exec rspec spec/"
12
+ end
13
+ task default: :test
@@ -10,33 +10,30 @@ class Ryo::BasicObject < BasicObject
10
10
  ##
11
11
  # @param props (see Ryo::Builder.build)
12
12
  # @param prototype (see Ryo::Builder.build)
13
- #
14
13
  # @return [Ryo::BasicObject]
15
- # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}.
14
+ # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}
16
15
  def self.create(props, prototype = nil)
17
16
  ::Ryo::Builder.build(self, props, prototype)
18
17
  end
19
18
 
20
19
  ##
21
- # Creates a Ryo object by recursively walking a Hash object.
20
+ # Creates a Ryo object by recursively walking a Hash object
22
21
  #
23
22
  # @param props (see Ryo::Builder.recursive_build)
24
23
  # @param prototype (see Ryo::Builder.recursive_build)
25
- #
26
24
  # @return [Ryo::BasicObject]
27
- # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}.
25
+ # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}
28
26
  def self.from(props, prototype = nil)
29
27
  ::Ryo::Builder.recursive_build(self, props, prototype)
30
28
  end
31
29
 
32
30
  ##
33
- # Duplicates the internals of a Ryo object.
31
+ # Duplicates the internals of a Ryo object
34
32
  #
35
33
  # @param [Ryo::BasicObject] ryo
36
- # A Ryo object.
37
- #
34
+ # A Ryo object
38
35
  # @return [Ryo::BasicObject]
39
- # Returns a Ryo object.
36
+ # Returns a Ryo object
40
37
  def initialize_dup(ryo)
41
38
  ::Ryo.set_table_of(self, ::Ryo.table_of(ryo).dup)
42
39
  ::Ryo.extend!(self, ::Ryo)
@@ -50,9 +47,8 @@ end
50
47
  #
51
48
  # @param props (see Ryo::Builder.build)
52
49
  # @param prototype (see Ryo::Builder.build)
53
- #
54
50
  # @return [Ryo::BasicObject]
55
- # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}.
51
+ # Returns an instance of {Ryo::BasicObject Ryo::BasicObject}
56
52
  def Ryo.BasicObject(props, prototype = nil)
57
53
  Ryo::BasicObject.create(props, prototype)
58
54
  end
data/lib/ryo/builder.rb CHANGED
@@ -1,29 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  ##
4
- # {Ryo::Builder Ryo::Builder} is a module that's used underneath Ryo's public
5
- # interface when creating instances of {Ryo::Object Ryo::Object}, and
6
- # {Ryo::BasicObject Ryo::BasicObject}. This module is not intended to be
7
- # used directly.
8
- #
4
+ # The {Ryo::Builder Ryo::Builder} module is responsible for
5
+ # the creation of instances of {Ryo::Object Ryo::Object},
6
+ # and {Ryo::BasicObject Ryo::BasicObject}. This module is
7
+ # not intended to be used directly.
9
8
  # @api private
10
9
  module Ryo::Builder
11
10
  ##
11
+ # @note
12
+ # When "props" is given as a Ryo object, a duplicate Ryo object is
13
+ # returned in its place
12
14
  # @param [<Ryo::Object, Ryo::BasicObject>] buildee
13
- # The class of the object to build.
14
- #
15
- # @param [<Hash, Ryo::Object, Ryo::BasicObject, #each_pair>] props
16
- # A Hash object, an object that implements "#each_pair", or a Ryo object.
17
- #
15
+ # @param [<#each_pair>] props
18
16
  # @param [<Ryo::Object, Ryo::BasicObject>, nil] prototype
19
- # The prototype, or nil for none.
20
- #
21
17
  # @return [<Ryo::Object, Ryo::BasicObject>]
22
- # Returns a Ryo object.
23
- #
24
- # @note
25
- # When "props" is given as a Ryo object, a duplicate Ryo object is
26
- # returned in its place.
18
+ # Returns a Ryo object
27
19
  def self.build(buildee, props, prototype = nil)
28
20
  if Ryo.ryo?(props)
29
21
  build(buildee, Ryo.table_of(props), prototype || Ryo.prototype_of(props))
@@ -38,7 +30,8 @@ module Ryo::Builder
38
30
  end
39
31
 
40
32
  ##
41
- # Creates a Ryo object by recursively walking a Hash object, or an Array of Hash objects.
33
+ # Creates a Ryo object by recursively walking a Hash object, or
34
+ # an Array of Hash objects
42
35
  #
43
36
  # @example
44
37
  # objects = Ryo.from([{x: 0, y: 0}, "foo", {point: {x: 0, y: 0}}])
@@ -46,22 +39,13 @@ module Ryo::Builder
46
39
  # objects[1] # => "foo"
47
40
  # objects[2].point.x # => 0
48
41
  #
49
- # @param buildee (see Ryo::Builder.build)
50
- #
51
- # @param [<Hash, Ryo::Object, Ryo::BasicObject, Array, #each_pair, #each> ] props
52
- # A Hash object, a Ryo object, or an array composed of either Hash / Ryo objects.
53
- #
54
- # @param prototype (see Ryo::Builder.build)
55
- #
42
+ # @note (see Ryo::Builder.build)
43
+ # @param (see Ryo::Builder.build)
56
44
  # @return (see Ryo::Builder.build)
57
- #
58
- # @note
59
- # When "props" is given as a Ryo object, a duplicate Ryo object is
60
- # returned in its place.
61
45
  def self.recursive_build(buildee, props, prototype = nil)
62
46
  if Ryo.ryo?(props)
63
47
  recursive_build(buildee, Ryo.table_of(props), prototype || Ryo.prototype_of(props))
64
- elsif eachless?(props)
48
+ elsif !respond_to_each?(props)
65
49
  raise TypeError, "The provided object does not implement #each / #each_pair"
66
50
  elsif !props.respond_to?(:each_pair)
67
51
  map(props) do
@@ -75,32 +59,29 @@ module Ryo::Builder
75
59
  end
76
60
  end
77
61
 
78
- ##
79
- # @private
80
- def self.map_value(buildee, value)
81
- if Ryo.ryo?(value) || eachless?(value)
82
- value
83
- elsif value.respond_to?(:each_pair)
84
- recursive_build(buildee, value)
85
- elsif value.respond_to?(:each)
86
- map(value) { map_value(buildee, _1) }
62
+ module Private
63
+ private
64
+
65
+ def map_value(buildee, value)
66
+ if Ryo.ryo?(value) || !respond_to_each?(value)
67
+ value
68
+ elsif value.respond_to?(:each_pair)
69
+ recursive_build(buildee, value)
70
+ elsif value.respond_to?(:each)
71
+ map(value) { map_value(buildee, _1) }
72
+ end
87
73
  end
88
- end
89
- private_class_method :map_value
90
74
 
91
- ##
92
- # @private
93
- def self.eachless?(value)
94
- !value.respond_to?(:each) && !value.respond_to?(:each_pair)
95
- end
96
- private_class_method :eachless?
75
+ def respond_to_each?(value)
76
+ value.respond_to?(:each) || value.respond_to?(:each_pair)
77
+ end
97
78
 
98
- ##
99
- # @private
100
- def self.map(obj)
101
- ary = []
102
- obj.each { ary.push(yield(_1)) }
103
- ary
79
+ def map(obj)
80
+ ary = []
81
+ obj.each { ary.push(yield(_1)) }
82
+ ary
83
+ end
104
84
  end
105
- private_class_method :map
85
+ private_constant :Private
86
+ extend Private
106
87
  end
@@ -1,14 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  ##
4
- # The {Ryo::Enumerable Ryo::Enumerable} module implements methods
5
- # for iterating through and performing operations on Ryo objects.
6
- # The methods implemented by this module are available as singleton
7
- # methods on the {Ryo} module.
4
+ # The {Ryo::Enumerable Ryo::Enumerable} module provides methods
5
+ # that are similar to Ruby's Enumerable module, and at the same
6
+ # time - intentionally different.
7
+ #
8
+ # For example: {Ryo::Enumerable Ryo::Enumerable}
9
+ # methods receive 'self' as an argument rather than from the
10
+ # surrounding context. The methods implemented by this
11
+ # module are available as singleton methods on the {Ryo Ryo}
12
+ # module.
8
13
  module Ryo::Enumerable
9
14
  ##
10
- # The {#each} methods iterates a Ryo object, and yields a key / value pair.
11
- # When a block is not given, {#each} returns an Enumerator.
15
+ # The {#each} method iterates through a Ryo object, and
16
+ # yields two parameters: a key, and a value
12
17
  #
13
18
  # @example
14
19
  # point_a = Ryo(x: 1, y: 2)
@@ -18,23 +23,19 @@ module Ryo::Enumerable
18
23
  # # ["y", 2]
19
24
  # # ["x", 1]
20
25
  #
21
- # @param [Ryo::Object, Ryo::BasicObject] ryo
22
- # A Ryo object.
23
- #
24
- # @param ancestors (see #each_ryo)
25
- #
26
+ # @param (see #each_ryo)
26
27
  # @return [<Enumerator, Array>]
27
- # Returns an Enumerator when a block is not given, otherwise returns an Array.
28
28
  def each(ryo, ancestors: nil)
29
29
  return enum_for(:each, ryo) unless block_given?
30
- each_ryo(ryo, ancestors: ancestors) do |_, key, value|
30
+ each_ryo(ryo, ancestors:) do |_, key, value|
31
31
  yield(key, value)
32
32
  end
33
33
  end
34
34
 
35
35
  ##
36
- # The {#each_ryo} method iterates through a Ryo object, and its prototypes.
37
- # {#each_ryo} yields three parameters: a Ryo object, a key, and a value.
36
+ # The {#each_ryo} method iterates through a Ryo object,
37
+ # and its prototypes. {#each_ryo} yields three parameters:
38
+ # a Ryo object, a key, and a value
38
39
  #
39
40
  # @example
40
41
  # point_a = Ryo(x: 1, y: 2)
@@ -45,15 +46,13 @@ module Ryo::Enumerable
45
46
  # # [point_a, "y", 2]
46
47
  #
47
48
  # @param [<Ryo::BasicObject, Ryo::Object>] ryo
48
- # A Ryo object.
49
- #
50
49
  # @param [Integer] ancestors
51
- # `ancestors` is an integer that determines how far up the prototype chain a
52
- # {Ryo::Enumerable Ryo::Enumerable} method can go. 0 covers a Ryo object,
53
- # and none of the prototypes in its prototype chain. 1 covers a Ryo object,
54
- # and one of the prototypes in its prototype chain - and so on. The default
55
- # behavior is to traverse the entire prototype chain.
56
- #
50
+ # "ancestors" is an integer that defines the traversal depth
51
+ # of a {Ryo::Enumerable Ryo::Enumerable} method. 0 covers a
52
+ # Ryo object, and none of the prototypes in its prototype
53
+ # chain. 1 covers a Ryo object, and one of the prototypes
54
+ # in its prototype chain - and so on. The default covers
55
+ # the entire prototype chain.
57
56
  # @return [<Ryo::BasicObject, Ryo::Object>]
58
57
  def each_ryo(ryo, ancestors: nil)
59
58
  proto_chain = [ryo, *prototype_chain_of(ryo)]
@@ -67,17 +66,19 @@ module Ryo::Enumerable
67
66
  end
68
67
 
69
68
  ##
70
- # The {#map} method creates a copy of a Ryo object, and then performs a map operation
71
- # on the copy and its prototypes.
69
+ # The {#map} method creates a copy of a Ryo object,
70
+ # and then performs a map operation on the copy and
71
+ # its prototypes
72
72
  #
73
- # @param (see #map!)
74
- # @return (see #map!)
73
+ # @param (see #each_ryo)
74
+ # @return [<Ryo::Object, Ryo::BasicObject>]
75
75
  def map(ryo, ancestors: nil, &b)
76
- map!(Ryo.dup(ryo), ancestors: ancestors, &b)
76
+ map!(Ryo.dup(ryo), ancestors:, &b)
77
77
  end
78
78
 
79
79
  ##
80
- # The {#map!} method performs an in-place map operation on a Ryo object, and its prototypes.
80
+ # The {#map!} method performs an in-place map operation
81
+ # on a Ryo object, and its prototypes
81
82
  #
82
83
  # @example
83
84
  # point = Ryo(x: 2, y: 4)
@@ -85,31 +86,28 @@ module Ryo::Enumerable
85
86
  # [point.x, point.y]
86
87
  # # => [4, 8]
87
88
  #
88
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
89
- # A Ryo object.
90
- #
91
- # @param ancestors (see #each_ryo)
92
- #
89
+ # @param (see #each_ryo)
93
90
  # @return [<Ryo::Object, Ryo::BasicObject>]
94
91
  def map!(ryo, ancestors: nil)
95
- each_ryo(ryo, ancestors: ancestors) do |ryo, key, value|
92
+ each_ryo(ryo, ancestors:) do |ryo, key, value|
96
93
  ryo[key] = yield(key, value)
97
94
  end
98
95
  end
99
96
 
100
97
  ##
101
- # The {#select} method creates a copy of a Ryo object, and then performs a filter operation
102
- # on the copy and its prototypes.
98
+ # The {#select} method creates a copy of a Ryo object, and
99
+ # then performs a filter operation on the copy and its
100
+ # prototypes
103
101
  #
104
- # @param (see #select!)
105
- # @return (see #select!)
102
+ # @param (see #each_ryo)
103
+ # @return [<Ryo::Object, Ryo::BasicObject>]
106
104
  def select(ryo, ancestors: nil, &b)
107
- select!(Ryo.dup(ryo), ancestors: ancestors, &b)
105
+ select!(Ryo.dup(ryo), ancestors:, &b)
108
106
  end
109
107
 
110
108
  ##
111
- # The {#select!} method performs an in-place filter operation on a Ryo object, and
112
- # its prototypes.
109
+ # The {#select!} method performs an in-place filter operation
110
+ # on a Ryo object, and its prototypes
113
111
  #
114
112
  # @example
115
113
  # point_a = Ryo(x: 1, y: 2, z: 3)
@@ -118,31 +116,27 @@ module Ryo::Enumerable
118
116
  # [point_b.x, point_b.y, point_b.z]
119
117
  # # => [1, 2, nil]
120
118
  #
121
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
122
- # A Ryo object.
123
- #
124
- # @param ancestors (see #each_ryo)
125
- #
119
+ # @param (see #each_ryo)
126
120
  # @return [<Ryo::Object, Ryo::BasicObject>]
127
121
  def select!(ryo, ancestors: nil)
128
- each_ryo(ryo, ancestors: ancestors) do |ryo, key, value|
122
+ each_ryo(ryo, ancestors:) do |ryo, key, value|
129
123
  delete(ryo, key) unless yield(key, value)
130
124
  end
131
125
  end
132
126
 
133
127
  ##
134
- # The {#reject} method creates a copy of a Ryo object, and then performs a filter operation
135
- # on the copy and its prototypes.
128
+ # The {#reject} method creates a copy of a Ryo object, and then
129
+ # performs a filter operation on the copy and its prototypes
136
130
  #
137
- # @param (see #reject!)
138
- # @return (see #reject!)
131
+ # @param (see #each_ryo)
132
+ # @return [<Ryo::Object, Ryo::BasicObject>]
139
133
  def reject(ryo, ancestors: nil, &b)
140
- reject!(Ryo.dup(ryo), ancestors: ancestors, &b)
134
+ reject!(Ryo.dup(ryo), ancestors:, &b)
141
135
  end
142
136
 
143
137
  ##
144
- # The {#reject!} method performs an in-place filter operation on a Ryo object, and
145
- # its prototypes.
138
+ # The {#reject!} method performs an in-place filter operation
139
+ # on a Ryo object, and its prototypes
146
140
  #
147
141
  # @example
148
142
  # point_a = Ryo(x: 1, y: 2, z: 3)
@@ -151,51 +145,39 @@ module Ryo::Enumerable
151
145
  # [point_b.x, point_b.y, point_b.z]
152
146
  # # => [1, 2, nil]
153
147
  #
154
- # @param [<Ryo::Object, Ryo::BasicObject>] ryo
155
- # A Ryo object.
156
- #
157
- # @param ancestors (see #each_ryo)
158
- #
148
+ # @param (see #each_ryo)
159
149
  # @return [<Ryo::Object, Ryo::BasicObject>]
160
150
  def reject!(ryo, ancestors: nil)
161
- each_ryo(ryo, ancestors: ancestors) do |ryo, key, value|
151
+ each_ryo(ryo, ancestors:) do |ryo, key, value|
162
152
  delete(ryo, key) if yield(key, value)
163
153
  end
164
154
  end
165
155
 
166
156
  ##
167
- # The {#any?} method iterates through a Ryo object, and its prototypes - yielding a
168
- # key / value pair to a block. If the block ever returns a truthy value, {#any?} will
169
- # break from the iteration and return true - otherwise false will be returned.
170
- #
171
- # @param ancestors (see #each_ryo)
157
+ # @param (see #each_ryo)
172
158
  # @return [Boolean]
159
+ # Returns true when the given block evaluates to
160
+ # a truthy value for at least one iteration
173
161
  def any?(ryo, ancestors: nil)
174
- each_ryo(ryo, ancestors: ancestors) do |_, key, value|
162
+ each_ryo(ryo, ancestors:) do |_, key, value|
175
163
  return true if yield(key, value)
176
164
  end
177
165
  false
178
166
  end
179
167
 
180
168
  ##
181
- # The {#all?} method iterates through a Ryo object, and its prototypes - yielding a
182
- # key / value pair to a block. If the block ever returns a falsey value, {#all?} will
183
- # break from the iteration and return false - otherwise true will be returned.
184
- #
185
- # @param ancestors (see #each_ryo)
169
+ # @param (see #each_ryo)
186
170
  # @return [Boolean]
171
+ # Returns true when the given block evaluates to a
172
+ # truthy value for every iteration
187
173
  def all?(ryo, ancestors: nil)
188
- each_ryo(ryo, ancestors: ancestors) do |_, key, value|
174
+ each_ryo(ryo, ancestors:) do |_, key, value|
189
175
  return false unless yield(key, value)
190
176
  end
191
177
  true
192
178
  end
193
179
 
194
180
  ##
195
- # The {#find} method iterates through a Ryo object, and its prototypes - yielding a
196
- # key / value pair to a block. If the block ever returns a truthy value, {#find} will
197
- # break from the iteration and return a Ryo object - otherwise nil will be returned.
198
- #
199
181
  # @example
200
182
  # point_a = Ryo(x: 5)
201
183
  # point_b = Ryo({y: 10}, point_a)
@@ -203,10 +185,11 @@ module Ryo::Enumerable
203
185
  # ryo = Ryo.find(point_c) { |key, value| value == 5 }
204
186
  # ryo == point_a # => true
205
187
  #
206
- # @param ancestors (see #each_ryo)
188
+ # @param (see #each_ryo)
207
189
  # @return [<Ryo::Object, Ryo::BasicObject>, nil]
190
+ # Returns a Ryo object, or nil
208
191
  def find(ryo, ancestors: nil)
209
- each_ryo(ryo, ancestors: ancestors) do |ryo, key, value|
192
+ each_ryo(ryo, ancestors:) do |ryo, key, value|
210
193
  return ryo if yield(key, value)
211
194
  end
212
195
  nil
data/lib/ryo/object.rb CHANGED
@@ -10,19 +10,17 @@ class Ryo::Object
10
10
  ##
11
11
  # @param props (see Ryo::Builder.build)
12
12
  # @param prototype (see Ryo::Builder.build)
13
- #
14
13
  # @return [Ryo::Object]
15
- # Returns an instance of {Ryo::Object Ryo::Object}.
14
+ # Returns an instance of {Ryo::Object Ryo::Object}
16
15
  def self.create(props, prototype = nil)
17
16
  Ryo::Builder.build(self, props, prototype)
18
17
  end
19
18
 
20
19
  ##
21
- # Creates a Ryo object by recursively walking a Hash object.
20
+ # Creates a Ryo object by recursively walking a Hash object
22
21
  #
23
22
  # @param props (see Ryo::Builder.recursive_build)
24
23
  # @param prototype (see Ryo::Builder.recursive_build)
25
- #
26
24
  # @return [Ryo::Object]
27
25
  # Returns an instance of {Ryo::Object Ryo::Object}.
28
26
  def self.from(props, prototype = nil)
@@ -30,13 +28,12 @@ class Ryo::Object
30
28
  end
31
29
 
32
30
  ##
33
- # Duplicates the internals of a Ryo object.
31
+ # Duplicates the internals of a Ryo object
34
32
  #
35
33
  # @param [Ryo::Object] ryo
36
- # A Ryo object.
37
- #
34
+ # A Ryo object
38
35
  # @return [Ryo::Object]
39
- # Returns a Ryo object.
36
+ # Returns a Ryo object
40
37
  def initialize_dup(ryo)
41
38
  Ryo.set_table_of(self, Ryo.table_of(ryo).dup)
42
39
  Ryo.extend!(self, Ryo)
@@ -50,9 +47,8 @@ end
50
47
  #
51
48
  # @param props (see Ryo::Builder.build)
52
49
  # @param prototype (see Ryo::Builder.build)
53
- #
54
50
  # @return [Ryo::Object]
55
- # Returns an instance of {Ryo::Object Ryo::Object}.
51
+ # Returns an instance of {Ryo::Object Ryo::Object}
56
52
  def Ryo.Object(props, prototype = nil)
57
53
  Ryo::Object.create(props, prototype)
58
54
  end