fiber_space 0.1.2 → 0.1.3

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 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
  - - ">="