enumerator-auto_forced_lazy 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: c3704643ea64116858cc2e47992b7a3f1f4b0a16217f03a35ce19f441435d5ad
4
+ data.tar.gz: b968ca193cc565813bdf7ee38cc94389617bd5d4cb153bc5a9fe985867891df8
5
+ SHA512:
6
+ metadata.gz: fc4b1c3971e1aa262870cafa823e6e139a4eccb1aa3fc826f587e2ce6c325ca5abb7423f6db2e495a47d2a3ebe0df2123a25a68ea55272b0ddf188c5c5d07124
7
+ data.tar.gz: 6378d0806fdc0413e9dac3a15a9bef0a9a6c10af2032c19eab126224cdb770936187e2221abce6a4fa520b84b4ba2a735739a9246d4bf1f9cb4b546a34511482
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2020 Gonçalo Cabrita
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,20 @@
1
+ [gem]: https://rubygems.org/gems/enumerator-auto_forced_lazy
2
+ [actions]: https://github.com/gmcabrita/enumerator-auto_forced_lazy/actions
3
+ [inchpages]: http://inch-ci.org/github/gmcabrita/enumerator-auto_forced_lazy
4
+ [rubydoc]: https://rubydoc.info/gems/enumerator-auto_forced_lazy
5
+
6
+ # enumerator-auto_forced_lazy
7
+
8
+ [![Build Status](https://img.shields.io/github/workflow/status/gmcabrita/enumerator-auto_forced_lazy/Check/master.svg)](actions)
9
+ [![Hex Version](http://img.shields.io/gem/v/enumerator-auto_forced_lazy.svg?style=flat)](gem)
10
+ [![Inline docs](http://inch-ci.org/github/gmcabrita/enumerator-auto_forced_lazy.svg?branch=master)][inchpages]
11
+
12
+ ## Links
13
+
14
+ - [API Documentation](rubydoc)
15
+
16
+ ## Supported Ruby versions
17
+
18
+ This library officially supports the following Ruby versions:
19
+
20
+ - MRI >= `2.4`
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ $:.push File.expand_path("../lib", __FILE__)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "enumerator-auto_forced_lazy"
7
+ spec.version = "0.1.0"
8
+ spec.platform = Gem::Platform::RUBY
9
+ spec.authors = ["Gonçalo Cabrita"]
10
+ spec.email = "_@gmcabrita.com"
11
+ spec.licenses = ["MIT"]
12
+ spec.summary = "Provides an AutoForcedLazy class that automatically forces the computation of an Enumerator::Lazy when needed."
13
+ spec.description = spec.summary
14
+ spec.homepage = "https://github.com/gmcabrita/enumerator-auto_forced_lazy"
15
+ spec.metadata = {"source_code_uri" => "https://github.com/gmcabrita/enumerator-auto_forced_lazy"}
16
+
17
+ spec.files = Dir["LICENSE", "README.md", "enumerator-auto_forced_lazy.gemspec", "lib/**/*"]
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
21
+ spec.metadata["source_code_uri"] = "https://github.com/gmcabrita/enumerator-auto_forced_lazy"
22
+ spec.metadata["bug_tracker_uri"] = "https://github.com/gmcabrita/enumerator-auto_forced_lazy/issues"
23
+
24
+ spec.required_ruby_version = ">= 2.4.0"
25
+
26
+ spec.add_development_dependency "bundler"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rspec"
29
+ spec.add_development_dependency "standardrb"
30
+ end
data/lib/enumerable.rb ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Enumerable
4
+ # Returns an Enumerator::AutoForcedLazy, which wraps Enumerator::Lazy to
5
+ # provide access to Array methods without requiring a previous explicit call
6
+ # to Enumerator::Lazy#force.
7
+ def auto_forced_lazy
8
+ lazy.auto_force
9
+ end
10
+ end
@@ -0,0 +1,2 @@
1
+ require "enumerable.rb"
2
+ require "enumerator.rb"
data/lib/enumerator.rb ADDED
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "delegate"
4
+
5
+ class Enumerator
6
+ # Enumerator::AutoForcedLazy is a thin wrapper around Enumerator::Lazy that
7
+ # automatically calls Enumerator::Lazy#force before a method call if the
8
+ # called method does not exist on Enumerator::Lazy but exists on Array.
9
+ #
10
+ # Enumerator::AutoForcedLazy can be constructed from any Enumerator::Lazy
11
+ # with the Enumerator::Lazy#auto_force method.
12
+ #
13
+ # (1..Float::INFINITY).lazy.auto_force.take_while { |i| i < 30 }
14
+ # => #<Enumerator::Lazy: #<Enumerator::Lazy: 1..Infinity>:take_while>
15
+ #
16
+ # Alternatively, Enumerator::AutoForcedLazy can also be constructed from any
17
+ # and from any Enumerable with the Enumerable#auto_forced_lazy method.
18
+ #
19
+ # (1..Float::INFINITY).auto_forced_lazy.take_while { |i| i < 30 }
20
+ # => #<Enumerator::Lazy: #<Enumerator::Lazy: 1..Infinity>:take_while>
21
+ #
22
+ # It is useful for keeping lazy enumerator semantics while providing easier
23
+ # access to Array methods by not requiring users to explicitly call
24
+ # Enumerator::Lazy#force.
25
+ class AutoForcedLazy < SimpleDelegator
26
+ ARRAY_OBJ = [].freeze
27
+
28
+ def initialize(lazy_enum)
29
+ super(lazy_enum)
30
+ end
31
+
32
+ # rubocop:disable Style/MissingRespondToMissing
33
+ def method_missing(m, *args, &block)
34
+ if __getobj__.respond_to?(m)
35
+ result = __getobj__.send(m, *args, &block)
36
+
37
+ if result.is_a?(Enumerator::Lazy)
38
+ __setobj__(result)
39
+
40
+ self
41
+ else
42
+ result
43
+ end
44
+ elsif ARRAY_OBJ.respond_to?(m)
45
+ __getobj__.force.send(m, *args, &block)
46
+ else
47
+ super
48
+ end
49
+ end
50
+ # rubocop:enable Style/MissingRespondToMissing
51
+ end
52
+
53
+ class Lazy
54
+ # Returns an Enumerator::AutoForcedLazy, which wraps Enumerator::Lazy to
55
+ # provide access to Array methods without requiring a previous explicit
56
+ # call to Enumerator::Lazy#force.
57
+ def auto_force
58
+ AutoForcedLazy.new(self)
59
+ end
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: enumerator-auto_forced_lazy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gonçalo Cabrita
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-04-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: standardrb
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Provides an AutoForcedLazy class that automatically forces the computation
70
+ of an Enumerator::Lazy when needed.
71
+ email: _@gmcabrita.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - LICENSE
77
+ - README.md
78
+ - enumerator-auto_forced_lazy.gemspec
79
+ - lib/enumerable.rb
80
+ - lib/enumerator-auto_forced_lazy.rb
81
+ - lib/enumerator.rb
82
+ homepage: https://github.com/gmcabrita/enumerator-auto_forced_lazy
83
+ licenses:
84
+ - MIT
85
+ metadata:
86
+ source_code_uri: https://github.com/gmcabrita/enumerator-auto_forced_lazy
87
+ allowed_push_host: https://rubygems.org
88
+ bug_tracker_uri: https://github.com/gmcabrita/enumerator-auto_forced_lazy/issues
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 2.4.0
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubygems_version: 3.1.2
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Provides an AutoForcedLazy class that automatically forces the computation
108
+ of an Enumerator::Lazy when needed.
109
+ test_files: []