enumex 0.0.1

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
+ 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: []