fiber_space 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ddfae833e07213b8ff682c8f0639a2709a03c514beac6d4de8dfa20233e720e
4
- data.tar.gz: 849a4c12e0ee774b446ba8e292a25647a2f6d23575a75e0aecbf666c11bf1e75
3
+ metadata.gz: d83521ec38b797598f2693b0beb903d9332577555552fb0542cb12a77a863942
4
+ data.tar.gz: 55c4da3f518d60657f6f69ad372d9924b685d441d3ce4e183c6ead26ef6498d4
5
5
  SHA512:
6
- metadata.gz: 3f7259faef883f01c7a0617a518c562af5d1df55fe4b7d06ec2a6f53ee7698e63cbc85543508ca94155e616cab4b18c5e53ec3390b5100294168439323f78b7d
7
- data.tar.gz: b74ace09cb4fc929f1259f02f52b5ddef6da0c85559f2d637857029adcd0465443ed7396e32c3e6be3eaafc99aaf03d95809c7bdf7b9607e9ce41ca3720fe3ea
6
+ metadata.gz: e2826512bfa1964e7255f04f060cdbc4433b62eefa35c9ac68df62ed4bb4787ea03a4a7267086c7ea4c088634a47ba4707a3bb0e101775d6d0041ef275dc9ac1
7
+ data.tar.gz: 488de7ce12a07fa8c7d28e7b6fa84adda5f790b034d224be0ee29eb6e892a7ec21aa07c8f7c0991ca10b222cf2e9269fbfe01830eef2cb825338a656a1a467c8
@@ -2,10 +2,16 @@ module FiberSpace
2
2
  # A FiberChain encapsulates and organizes a SortedSet of Fiber or FiberContainer objects. It facilitates the sequential execution of Fiber and FiberContainer objects.
3
3
  class FiberChain
4
4
 
5
+ # @!attribute [r] closed
6
+ # @return [Boolean] has the chain closed?
7
+ attr_accessor :closed
8
+
5
9
  # Constructs a new FiberChain
6
10
  # @param containers [Array] collection of Fibers or FiberContainers.
7
- def initialize(*containers)
11
+ def initialize(*containers, continuous: false)
12
+ @continuous_mode = continuous
8
13
  @stack = SortedSet.new
14
+ @closed = false
9
15
  containers.each { |fiber_container| register(fiber_container) }
10
16
  end
11
17
 
@@ -13,18 +19,22 @@ module FiberSpace
13
19
  def iterate
14
20
  @worker ||= Fiber.new do
15
21
  loop do
22
+ break if !@continuous_mode && complete?
23
+
16
24
  if @stack.any?(&:completed?)
17
25
  @stack.delete_if(&:completed?)
18
26
  prepare
19
27
  end
28
+
29
+ if @continuous_mode
30
+ Fiber.yield(@stack.each(&:resume))
31
+ else
32
+ Fiber.yield(@stack.first&.resume)
33
+ end
20
34
  rescue StandardError => e
21
35
  puts 'An error occurred during FiberChain#iterate!'
22
36
  puts e.message
23
37
  puts e.backtrace&.join("\n")
24
- ensure
25
- break if complete?
26
-
27
- Fiber.yield(@stack.first.resume)
28
38
  end
29
39
  end
30
40
  @worker.resume
@@ -32,7 +42,14 @@ module FiberSpace
32
42
 
33
43
  # Begins executing all items within the FiberChain#stack until all items are complete or the stack is empty.
34
44
  def execute
35
- iterate until complete?
45
+ if @continuous_mode
46
+ loop do
47
+ iterate
48
+ break if @closed
49
+ end
50
+ else
51
+ iterate until complete?
52
+ end
36
53
  end
37
54
 
38
55
  # Pushes an item to the FiberChain#stack
@@ -54,7 +71,11 @@ module FiberSpace
54
71
  # Has all elements of the FiberChain#stack completed execution?
55
72
  # @return [Boolean]
56
73
  def complete?
57
- @stack.empty? || @stack.all?(&:completed?)
74
+ if @continuous_mode
75
+ @stack.all?(&:completed?) || @closed
76
+ else
77
+ @stack.empty? || @stack.all?(&:completed?) || @closed
78
+ end
58
79
  end
59
80
 
60
81
  private
@@ -33,19 +33,15 @@ module FiberSpace
33
33
  @cache = opt[:cache] || []
34
34
  @source = opt[:source] || Fiber.new do |cached|
35
35
  loop do
36
- if @count.zero? || @count.negative?
36
+ if completed?
37
37
  case @target
38
38
  when FiberContainer then @target.completed? ? break : @target.resume
39
39
  when Fiber then @target.resume if @target.alive?
40
40
  else break
41
41
  end
42
- elsif @count == :once || completed?
43
- break
44
42
  else
45
- unless completed?
46
- @count -= 1
47
- Fiber.yield(yield(cached))
48
- end
43
+ @count -= 1 unless @count == :infinite
44
+ Fiber.yield(yield(cached))
49
45
  end
50
46
  end
51
47
  end
@@ -58,7 +54,11 @@ module FiberSpace
58
54
  # Is the fiber completed?
59
55
  # @return [Boolean]
60
56
  def completed?
61
- @count.zero? || @count.negative? || !@source.alive?
57
+ if @count == :infinite
58
+ !@source.alive?
59
+ else
60
+ @count == :once || @count.zero? || @count.negative? || !@source.alive?
61
+ end
62
62
  end
63
63
 
64
64
  # Mutual comparison operator
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fiber_space
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick W.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-11 00:00:00.000000000 Z
11
+ date: 2022-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: druuid
@@ -48,6 +48,7 @@ post_install_message:
48
48
  rdoc_options: []
49
49
  require_paths:
50
50
  - lib
51
+ - lib/fiber_space
51
52
  required_ruby_version: !ruby/object:Gem::Requirement
52
53
  requirements:
53
54
  - - ">="