enumex 0.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 +7 -0
- data/README.md +43 -0
- data/enumex.gemspec +15 -0
- data/lib/enumex/action.rb +16 -0
- data/lib/enumex/actions.rb +35 -0
- data/lib/enumex/base.rb +36 -0
- data/lib/enumex/extenders/every_once_extender.rb +51 -0
- data/lib/enumex/extenders/every_time_extender.rb +33 -0
- data/lib/enumex/version.rb +3 -0
- data/lib/enumex.rb +45 -0
- metadata +52 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6651c8a9336684d0e1cd34331e9d69ce75b7770d
|
4
|
+
data.tar.gz: ba8c16d31f15303c0ec6be0336201aae786c561d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b174dc6ce15e5fabc5eae0097888c4381dff8781f44de955ddca5d0275cb292b78256b88458be2db8f001122b95fc1f460f8bb2acd8178bdac67489cb9b42981
|
7
|
+
data.tar.gz: 509b2bbb3653178598391135a2cee51683e237ae545dcb169d2b5df71a561364688833ac51c694516a1a5785f453b204464a747e4ab5a94af8eff4b548410525
|
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
Enumex
|
2
|
+
============================================================
|
3
|
+
|
4
|
+
Enumex is a utility to attach preprocessing and postprocessing
|
5
|
+
to Enumerator.
|
6
|
+
|
7
|
+
Usage
|
8
|
+
------------------------------------------------------------
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
using Enumex
|
12
|
+
|
13
|
+
extension = enumex.pre_action.every_time { print "- " }
|
14
|
+
extension.post_action.every_once(3).times { puts "sleep" }
|
15
|
+
extension.attach_to((1..10).each) do |n|
|
16
|
+
puts n
|
17
|
+
end
|
18
|
+
|
19
|
+
# - 1
|
20
|
+
# - 2
|
21
|
+
# - 3
|
22
|
+
# sleep
|
23
|
+
# - 4
|
24
|
+
# - 5
|
25
|
+
# - 6
|
26
|
+
# sleep
|
27
|
+
# - 7
|
28
|
+
# - 8
|
29
|
+
# - 9
|
30
|
+
# sleep
|
31
|
+
# - 10
|
32
|
+
# => 1..10
|
33
|
+
```
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
using Enumex
|
37
|
+
|
38
|
+
enumex((1..10).each) {|n|
|
39
|
+
puts "- #{n}"
|
40
|
+
}.post_action.every_once(3).times {
|
41
|
+
puts "sleep"
|
42
|
+
}
|
43
|
+
```
|
data/enumex.gemspec
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path('../lib/enumex/version', __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = 'enumex'
|
5
|
+
gem.version = Enumex::VERSION
|
6
|
+
gem.authors = ['m4oda']
|
7
|
+
gem.email = 'e5ww2sze@gmail.com'
|
8
|
+
gem.description = 'Enumex is a utility for Enumerator.'
|
9
|
+
gem.summary = 'Enumex is a utility for Enumerator.'
|
10
|
+
gem.homepage = 'https://github.com/m4oda/enumex'
|
11
|
+
gem.license = 'MIT'
|
12
|
+
gem.require_paths = ['lib']
|
13
|
+
gem.files = %w(README.md enumex.gemspec)
|
14
|
+
gem.files += Dir['lib/**/*.rb']
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Enumex
|
2
|
+
class Action
|
3
|
+
extend Forwardable
|
4
|
+
|
5
|
+
def_delegators :@root,
|
6
|
+
:attach_to, :enumerator, :run,
|
7
|
+
*Actions.types.map {|nm| "#{nm}_action" }
|
8
|
+
|
9
|
+
attr_reader :root, :extenders
|
10
|
+
|
11
|
+
def initialize(root)
|
12
|
+
@root = root
|
13
|
+
@extenders = []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Enumex
|
2
|
+
class Actions
|
3
|
+
class << self
|
4
|
+
def types
|
5
|
+
[:post, :pre]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(base)
|
10
|
+
@base = base
|
11
|
+
end
|
12
|
+
|
13
|
+
types.each do |nm|
|
14
|
+
define_method nm, -> do
|
15
|
+
name = "@#{nm}"
|
16
|
+
v = instance_variable_get(name)
|
17
|
+
v ? v : instance_variable_set(name, Action.new(base))
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
define_method :types, -> { self.class.types }
|
22
|
+
|
23
|
+
def reset
|
24
|
+
types.each {|nm| public_send(nm).extenders.each(&:reset) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def empty?
|
28
|
+
types.all? {|t| public_send(t).extenders.empty? }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
attr_reader :base
|
34
|
+
end
|
35
|
+
end
|
data/lib/enumex/base.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Enumex
|
2
|
+
class Base
|
3
|
+
attr_reader :enumerator, :extenders
|
4
|
+
|
5
|
+
def attach_to(enumerator, &block)
|
6
|
+
@enumerator = enumerator
|
7
|
+
@block = block
|
8
|
+
|
9
|
+
actions.empty? ? self : run
|
10
|
+
end
|
11
|
+
|
12
|
+
Actions.types.each do |nm|
|
13
|
+
define_method "#{nm}_action", -> { actions.public_send(nm) }
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
actions.reset
|
18
|
+
|
19
|
+
enumerator.each do |*args|
|
20
|
+
actions.pre.extenders.any? {|ext| ext.execute(*args) }
|
21
|
+
|
22
|
+
block.call(*args).tap do |result|
|
23
|
+
actions.post.extenders.each {|ext| ext.execute(*args) }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :block
|
31
|
+
|
32
|
+
def actions
|
33
|
+
@actions ||= Actions.new(self)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Enumex
|
2
|
+
module Extenders
|
3
|
+
class EveryOnceExtender
|
4
|
+
extend Forwardable
|
5
|
+
|
6
|
+
Port = Module.new do
|
7
|
+
def every_once(number)
|
8
|
+
EveryOnceExtender.new(self, number)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def_delegators :@executor, :execute, :reset
|
13
|
+
|
14
|
+
def initialize(base, number)
|
15
|
+
raise ArgumentError if number.to_i <= 0
|
16
|
+
@base = base
|
17
|
+
@executor = Counter.new(number)
|
18
|
+
end
|
19
|
+
|
20
|
+
def times(&block)
|
21
|
+
executor.block = block
|
22
|
+
base.extenders << self if block_given?
|
23
|
+
|
24
|
+
base.enumerator ? base.run : base
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :base, :executor
|
30
|
+
|
31
|
+
class Counter
|
32
|
+
attr_reader :counter, :max_number
|
33
|
+
attr_accessor :block
|
34
|
+
|
35
|
+
def initialize(number)
|
36
|
+
@counter = (1..number).cycle
|
37
|
+
@max_number = number
|
38
|
+
end
|
39
|
+
|
40
|
+
def reset
|
41
|
+
counter.rewind
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute(*args)
|
45
|
+
return if counter.next != max_number
|
46
|
+
block.call(*args) if block
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Enumex
|
2
|
+
module Extenders
|
3
|
+
class EveryTimeExtender
|
4
|
+
Port = Module.new do
|
5
|
+
def every_time(&block)
|
6
|
+
EveryTimeExtender.new(self, &block).value
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(base, &block)
|
11
|
+
@base = base
|
12
|
+
@block = block
|
13
|
+
base.extenders << self if block_given?
|
14
|
+
base.enumerator ? base.run : base
|
15
|
+
end
|
16
|
+
|
17
|
+
def reset
|
18
|
+
end
|
19
|
+
|
20
|
+
def execute(*args)
|
21
|
+
block.call(*args) if block
|
22
|
+
end
|
23
|
+
|
24
|
+
def value
|
25
|
+
base.enumerator ? base.run : base
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
attr_reader :base, :block
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/enumex.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'enumex/version'
|
3
|
+
|
4
|
+
module Enumex
|
5
|
+
# Enumex.attach_to([1, 2, 3, 4, 5].each) {|n|
|
6
|
+
# puts n
|
7
|
+
# }.every_once(3).times {
|
8
|
+
# puts "\n"
|
9
|
+
# }
|
10
|
+
#
|
11
|
+
# enm = Enumex.every_once(3).times do
|
12
|
+
# "\n"
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# enum.attach_to([1, 2, 3, 4, 5].each) do |n|
|
16
|
+
# puts n
|
17
|
+
# end
|
18
|
+
|
19
|
+
autoload :Base, 'enumex/base'
|
20
|
+
autoload :Action, 'enumex/action'
|
21
|
+
autoload :Actions, 'enumex/actions'
|
22
|
+
|
23
|
+
module Extenders
|
24
|
+
autoload :EveryOnceExtender, 'enumex/extenders/every_once_extender'
|
25
|
+
autoload :EveryTimeExtender, 'enumex/extenders/every_time_extender'
|
26
|
+
end
|
27
|
+
|
28
|
+
class << self
|
29
|
+
def new(enumerator = nil, &block)
|
30
|
+
Base.new.tap {|enmx| enmx.attach_to(enumerator, &block) if enumerator }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Extenders.constants.map {|nm|
|
35
|
+
Extenders.const_get(nm)
|
36
|
+
}.each do |klass|
|
37
|
+
Action.instance_eval { include klass::Port }
|
38
|
+
end
|
39
|
+
|
40
|
+
refine Object do
|
41
|
+
define_method :enumex, ->(enumerator = nil, &block) do
|
42
|
+
Enumex.new(enumerator, &block)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: enumex
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- m4oda
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-11-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Enumex is a utility for Enumerator.
|
14
|
+
email: e5ww2sze@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.md
|
20
|
+
- enumex.gemspec
|
21
|
+
- lib/enumex.rb
|
22
|
+
- lib/enumex/action.rb
|
23
|
+
- lib/enumex/actions.rb
|
24
|
+
- lib/enumex/base.rb
|
25
|
+
- lib/enumex/extenders/every_once_extender.rb
|
26
|
+
- lib/enumex/extenders/every_time_extender.rb
|
27
|
+
- lib/enumex/version.rb
|
28
|
+
homepage: https://github.com/m4oda/enumex
|
29
|
+
licenses:
|
30
|
+
- MIT
|
31
|
+
metadata: {}
|
32
|
+
post_install_message:
|
33
|
+
rdoc_options: []
|
34
|
+
require_paths:
|
35
|
+
- lib
|
36
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
requirements: []
|
47
|
+
rubyforge_project:
|
48
|
+
rubygems_version: 2.4.5
|
49
|
+
signing_key:
|
50
|
+
specification_version: 4
|
51
|
+
summary: Enumex is a utility for Enumerator.
|
52
|
+
test_files: []
|