ntl-actor 0.6.2 → 1.0.0.pre1

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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/lib/actor.rb +45 -19
  3. data/lib/actor/actor.rb +12 -132
  4. data/lib/actor/build.rb +36 -0
  5. data/lib/actor/controls.rb +7 -7
  6. data/lib/actor/messages.rb +20 -4
  7. data/lib/actor/messaging/address.rb +26 -0
  8. data/lib/actor/messaging/address/controls.rb +11 -0
  9. data/lib/actor/messaging/address/dependency.rb +13 -0
  10. data/lib/actor/messaging/address/none.rb +33 -0
  11. data/lib/actor/messaging/message.rb +39 -1
  12. data/lib/actor/messaging/message/name.rb +33 -0
  13. data/lib/actor/messaging/publisher.rb +39 -0
  14. data/lib/actor/messaging/publisher/assertions.rb +11 -0
  15. data/lib/actor/messaging/publisher/dependency.rb +13 -0
  16. data/lib/actor/messaging/publisher/substitute.rb +62 -0
  17. data/lib/actor/messaging/queue.rb +21 -0
  18. data/lib/actor/messaging/queue/substitute.rb +53 -0
  19. data/lib/actor/messaging/reader.rb +32 -0
  20. data/lib/actor/messaging/reader/assertions.rb +25 -0
  21. data/lib/actor/messaging/reader/dependency.rb +13 -0
  22. data/lib/actor/messaging/reader/substitute.rb +31 -0
  23. data/lib/actor/messaging/writer.rb +28 -0
  24. data/lib/actor/messaging/writer/dependency.rb +13 -0
  25. data/lib/actor/messaging/writer/substitute.rb +45 -0
  26. data/lib/actor/module/dependencies.rb +30 -0
  27. data/lib/actor/module/dependencies/assertions.rb +23 -0
  28. data/lib/actor/module/handler.rb +31 -0
  29. data/lib/actor/module/handler/macro.rb +13 -0
  30. data/lib/actor/module/handler/method_name.rb +13 -0
  31. data/lib/actor/module/include_assertions.rb +18 -0
  32. data/lib/actor/module/run_loop.rb +19 -0
  33. data/lib/actor/module/start.rb +27 -0
  34. data/lib/actor/module/suspend_resume.rb +36 -0
  35. data/lib/actor/module/suspend_resume/assertions.rb +26 -0
  36. data/lib/actor/module/suspend_resume/configure.rb +13 -0
  37. data/lib/actor/module/suspend_resume/controls.rb +17 -0
  38. data/lib/actor/module/suspend_resume/handle.rb +17 -0
  39. data/lib/actor/module/suspend_resume/initialize.rb +13 -0
  40. data/lib/actor/start.rb +34 -34
  41. data/lib/actor/supervisor.rb +60 -71
  42. data/lib/actor/supervisor/address/get.rb +15 -0
  43. data/lib/actor/supervisor/address/put.rb +13 -0
  44. data/lib/actor/supervisor/address/registry.rb +7 -0
  45. data/lib/actor/supervisor/assertions.rb +20 -0
  46. metadata +42 -28
  47. data/lib/actor/address.rb +0 -18
  48. data/lib/actor/controls/actor.rb +0 -89
  49. data/lib/actor/controls/address.rb +0 -48
  50. data/lib/actor/controls/error.rb +0 -11
  51. data/lib/actor/controls/message.rb +0 -39
  52. data/lib/actor/controls/message/attribute.rb +0 -17
  53. data/lib/actor/controls/thread.rb +0 -9
  54. data/lib/actor/controls/uuid.rb +0 -15
  55. data/lib/actor/destructure.rb +0 -23
  56. data/lib/actor/duration.rb +0 -7
  57. data/lib/actor/future.rb +0 -38
  58. data/lib/actor/handle_macro.rb +0 -37
  59. data/lib/actor/messaging/read.rb +0 -54
  60. data/lib/actor/messaging/read/substitute.rb +0 -33
  61. data/lib/actor/messaging/write.rb +0 -26
  62. data/lib/actor/messaging/write/substitute.rb +0 -39
  63. data/lib/actor/observers.rb +0 -45
  64. data/lib/actor/router.rb +0 -94
  65. data/lib/actor/stream.rb +0 -36
  66. data/lib/actor/substitutes/kernel.rb +0 -23
  67. data/lib/actor/substitutes/thread.rb +0 -39
  68. data/lib/actor/substitutes/thread_group.rb +0 -26
@@ -1,7 +0,0 @@
1
- module Actor
2
- module Duration
3
- def self.millisecond
4
- 0.001
5
- end
6
- end
7
- end
data/lib/actor/future.rb DELETED
@@ -1,38 +0,0 @@
1
- module Actor
2
- class Future
3
- attr_reader :reader
4
- attr_accessor :message
5
-
6
- def initialize reader
7
- @reader = reader
8
- end
9
-
10
- def self.build &block
11
- address = Address.build
12
- reader = Messaging::Read.build address
13
-
14
- instance = new reader
15
-
16
- block.(address)
17
-
18
- instance
19
- end
20
-
21
- def self.get wait: nil, &block
22
- instance = build &block
23
- instance.get wait: wait
24
- end
25
-
26
- def get wait: nil
27
- return message unless message.nil?
28
-
29
- self.message = reader.(wait: wait)
30
- end
31
-
32
- def ready?
33
- get
34
-
35
- message ? true : false
36
- end
37
- end
38
- end
@@ -1,37 +0,0 @@
1
- module Actor
2
- module HandleMacro
3
- def handle_macro pattern, &action
4
- method_name = MethodName.get pattern
5
-
6
- define_method method_name, &action
7
- end
8
- alias_method :handle, :handle_macro
9
-
10
- module MethodName
11
- PATTERN = %r{(?:\A|[a-z0-9])[A-Z]}
12
-
13
- def self.get message_pattern
14
- case message_pattern
15
- when Class, String then
16
- message_name = message_pattern.to_s
17
-
18
- *, message_name = message_name.split '::'
19
-
20
- message_name.gsub! PATTERN do |str|
21
- str.downcase!
22
- str.insert 1, '_' if str.length == 2
23
- str
24
- end
25
-
26
- get message_name.to_sym
27
-
28
- when Symbol then
29
- :"handle_#{message_pattern}"
30
-
31
- else
32
- get message_pattern.class
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,54 +0,0 @@
1
- module Actor
2
- module Messaging
3
- class Read
4
- attr_reader :queue
5
- attr_reader :stream
6
-
7
- def initialize queue, stream
8
- @queue = queue
9
- @stream = stream
10
- end
11
-
12
- def self.build address, queue=nil
13
- queue ||= Queue.new
14
-
15
- stream = address.stream
16
- stream.add_queue queue
17
-
18
- instance = new queue, stream
19
- instance
20
- end
21
-
22
- def self.call address, wait: nil
23
- instance = build address
24
- instance.(wait: wait)
25
- end
26
-
27
- def self.configure receiver, address, attr_name: nil
28
- attr_name ||= :reader
29
-
30
- instance = build address
31
- receiver.public_send "#{attr_name}=", instance
32
- instance
33
- end
34
-
35
- def call wait: nil
36
- if wait
37
- queue.deq
38
- else
39
- non_block = true
40
-
41
- begin
42
- queue.deq non_block
43
- rescue ThreadError
44
- nil
45
- end
46
- end
47
- end
48
-
49
- def messages_available?
50
- not queue.empty?
51
- end
52
- end
53
- end
54
- end
@@ -1,33 +0,0 @@
1
- module Actor
2
- module Messaging
3
- class Read
4
- class Substitute
5
- def call wait: nil
6
- message = messages.shift
7
-
8
- if message.nil? and wait
9
- raise WouldWait
10
- end
11
-
12
- message
13
- end
14
-
15
- def messages_available?
16
- messages.any?
17
- end
18
-
19
- def add_message message
20
- messages << message
21
- end
22
-
23
- def messages
24
- @messages ||= []
25
- end
26
-
27
- WouldWait = Class.new StandardError
28
-
29
- singleton_class.send :alias_method, :build, :new
30
- end
31
- end
32
- end
33
- end
@@ -1,26 +0,0 @@
1
- module Actor
2
- module Messaging
3
- class Write
4
- def self.call message, address
5
- instance = new
6
- instance.(message, address)
7
- end
8
-
9
- def self.configure receiver, attr_name: nil
10
- attr_name ||= :writer
11
-
12
- instance = new
13
- receiver.public_send "#{attr_name}=", instance
14
- instance
15
- end
16
-
17
- def call message, address
18
- stream = address.stream
19
-
20
- stream.write message
21
-
22
- nil
23
- end
24
- end
25
- end
26
- end
@@ -1,39 +0,0 @@
1
- module Actor
2
- module Messaging
3
- class Write
4
- class Substitute
5
- attr_reader :records
6
-
7
- def initialize
8
- @records = []
9
- end
10
-
11
- def call message, address
12
- record = Record.new message, address
13
-
14
- records << record
15
-
16
- record
17
- end
18
-
19
- Record = Struct.new :message, :address
20
-
21
- singleton_class.send :alias_method, :build, :new
22
-
23
- module Assertions
24
- def written? message=nil, &block
25
- if message.nil?
26
- block ||= proc { true }
27
- else
28
- block ||= proc { |msg| msg == message }
29
- end
30
-
31
- records.any? do |record|
32
- block.(record.message, record.address)
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,45 +0,0 @@
1
- module Actor
2
- module Observers
3
- def observe message_pattern, &callback
4
- handler_method = HandleMacro::MethodName.get message_pattern
5
-
6
- observer_id = callback.object_id
7
-
8
- record = Observer.new observer_id, handler_method, callback
9
-
10
- add_observer record
11
- end
12
-
13
- def add_observer record
14
- observers = observer_registry[record.handler_method]
15
-
16
- observers[record.observer_id] = record
17
- end
18
-
19
- def notify_observers message
20
- handler_method = HandleMacro::MethodName.get message
21
-
22
- observers = observer_registry[handler_method]
23
-
24
- observers.each_value.map do |record|
25
- callback = record.callback
26
-
27
- callback.(message)
28
- end
29
- end
30
-
31
- def remove_observer record
32
- observers = observer_registry[record.handler_method]
33
-
34
- observers.delete record.observer_id
35
- end
36
-
37
- def observer_registry
38
- @observer_registry ||= Hash.new do |hash, handler_method|
39
- hash[handler_method] = {}
40
- end
41
- end
42
-
43
- Observer = Struct.new :observer_id, :handler_method, :callback
44
- end
45
- end
data/lib/actor/router.rb DELETED
@@ -1,94 +0,0 @@
1
- module Actor
2
- class Router
3
- include Actor
4
-
5
- attr_writer :kernel
6
- attr_reader :routes
7
-
8
- def initialize
9
- @routes = Hash.new do |hash, input|
10
- hash[input] = Set.new
11
- end
12
- end
13
-
14
- handle :start do
15
- :continue
16
- end
17
-
18
- handle :continue do
19
- routed_messages = route_messages
20
-
21
- unless routed_messages
22
- kernel.sleep Duration.millisecond
23
- end
24
-
25
- :continue
26
- end
27
-
28
- handle :add_route do |message|
29
- reader = message.reader
30
- output_address = message.output_address
31
-
32
- add reader, output_address
33
- end
34
-
35
- handle :remove_route do |message|
36
- reader = message.reader
37
- output_address = message.output_address
38
-
39
- remove reader, output_address
40
- end
41
-
42
- handle :stop do
43
- if routes.any? { |reader, _| reader.messages_available? }
44
- route_messages
45
- :stop
46
- else
47
- super()
48
- end
49
- end
50
-
51
- def add reader, output_address
52
- routes[reader] << output_address
53
- end
54
-
55
- def remove reader, output_address
56
- routes[reader].delete output_address
57
- end
58
-
59
- def route_messages
60
- routed_messages = false
61
-
62
- routes.each do |input_reader, outputs|
63
- msg = input_reader.(wait: false)
64
-
65
- next unless msg
66
-
67
- routed_messages = true
68
-
69
- outputs.each do |output|
70
- writer.(msg, output)
71
- end
72
- end
73
-
74
- routed_messages
75
- end
76
-
77
- def configure
78
- self.kernel = Kernel
79
- end
80
-
81
- def kernel
82
- @kernel ||= Substitutes::Kernel.new
83
- end
84
-
85
- AddRoute = Struct.new :reader, :output_address
86
- RemoveRoute = Struct.new :reader, :output_address
87
-
88
- module Assertions
89
- def route? reader, output_address
90
- routes[reader].include? output_address
91
- end
92
- end
93
- end
94
- end
data/lib/actor/stream.rb DELETED
@@ -1,36 +0,0 @@
1
- module Actor
2
- class Stream
3
- attr_reader :queues
4
-
5
- def initialize
6
- @queues = Set.new
7
- end
8
-
9
- def add_queue queue
10
- queues << queue
11
- end
12
-
13
- def remove_queue queue
14
- queues.delete queue
15
- end
16
-
17
- def write message
18
- queues.each do |queue|
19
- queue.enq message
20
- end
21
- end
22
-
23
- module Null
24
- extend self
25
-
26
- def add_queue queue
27
- end
28
-
29
- def remove_queue queue
30
- end
31
-
32
- def write message
33
- end
34
- end
35
- end
36
- end
@@ -1,23 +0,0 @@
1
- module Actor
2
- module Substitutes
3
- class Kernel
4
- def initialize
5
- @sleep_duration = nil
6
- end
7
-
8
- def sleep duration=nil
9
- @sleep_duration = duration
10
- end
11
-
12
- module Assertions
13
- def slept? duration=nil
14
- if duration.nil?
15
- @sleep_duration ? true : false
16
- else
17
- @sleep_duration == duration
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end