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 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
@@ -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
@@ -0,0 +1,3 @@
1
+ module Enumex
2
+ VERSION = '0.0.1'
3
+ 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: []