ntl-actor 0.4.0.pre3 → 0.4.0.pre4

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
  SHA1:
3
- metadata.gz: dbe44cb51a0d65ba55a27567bf83be3730356148
4
- data.tar.gz: a8b2ce1e78a1e2ed0ceaf03033143724708c985d
3
+ metadata.gz: 43216310eef877e2e2c50d3715f828a3d31c1cde
4
+ data.tar.gz: 83a9a5a6617bb54e4d8c265d8169abdeea323764
5
5
  SHA512:
6
- metadata.gz: 5e3bfa5de54e9b4100477c9ec769547aa10b075e527cef2f0a1af5a921e99d25ed13e286e5eb8ba981ea237c4132fd1478432f3cfe265ff672627c69b9405121
7
- data.tar.gz: 93cfaa302f392e08de33928dbde3fb32713889e5b855f17e6e59fd1581c595c4d5acc39a85485059d95fe38b2cf3a52fd026d6503e9f5f8e1d5b7343775bf970
6
+ metadata.gz: 226255ae3858f8c2b0998c021af03a90a0bd2ff2b022abd3de775778e6f855c36f656921ab871e9742cc9248276bac112e266307f2cce5c4dc971a2b903ec031
7
+ data.tar.gz: 4e46b6c26b47d5b6ea1c98a5d5fa2486fa82463b235b3258217f1e623328c5183c1984b026e194a0649774ede0021452c91ccba28502831a56adf28a90802d60
data/lib/actor.rb CHANGED
@@ -19,11 +19,9 @@ require 'actor/messaging/write/substitute'
19
19
 
20
20
  require 'actor/messages'
21
21
 
22
- require 'actor/module/build'
23
- require 'actor/module/handle_macro'
24
- require 'actor/module/observers'
25
- require 'actor/module/start'
26
- require 'actor/module'
22
+ require 'actor/build'
23
+ require 'actor/handle_macro'
24
+ require 'actor/observers'
27
25
 
28
26
  require 'actor/start'
29
27
 
data/lib/actor/actor.rb CHANGED
@@ -8,4 +8,106 @@ module Actor
8
8
  def self.included cls
9
9
  cls.include Module unless cls == Object
10
10
  end
11
+
12
+ module Module
13
+ def self.included cls
14
+ cls.class_exec do
15
+ extend Build
16
+ extend HandleMacro
17
+ extend Start
18
+
19
+ include Observers
20
+ end
21
+ end
22
+
23
+ attr_writer :address
24
+ attr_writer :reader
25
+ attr_writer :writer
26
+
27
+ def configure
28
+ end
29
+
30
+ def continuations
31
+ @continuations ||= []
32
+ end
33
+
34
+ def handle message
35
+ method = handle? message
36
+
37
+ return if method.nil?
38
+
39
+ if method.arity == 0
40
+ return_value = method.()
41
+ else
42
+ return_value = method.(message)
43
+ end
44
+
45
+ notify_observers message
46
+
47
+ return_value
48
+ end
49
+
50
+ def handle_stop
51
+ raise StopIteration
52
+ end
53
+
54
+ def handle? message
55
+ method_name = HandleMacro::MethodName.get message
56
+
57
+ if respond_to? method_name
58
+ method method_name
59
+ end
60
+ end
61
+
62
+ def next
63
+ if continuations.empty?
64
+ message = reader.(wait: true)
65
+ else
66
+ message = reader.(wait: false)
67
+ message ||= continuations.shift
68
+ end
69
+
70
+ continuation_message = handle message
71
+
72
+ if handle? continuation_message
73
+ continuations << continuation_message
74
+ end
75
+ end
76
+
77
+ def run_loop
78
+ loop do
79
+ self.next
80
+ Thread.pass
81
+ end
82
+ end
83
+ alias_method :start, :run_loop
84
+
85
+ def address
86
+ @address ||= Address::None
87
+ end
88
+
89
+ def reader
90
+ @reader ||= Messaging::Read::Substitute.new
91
+ end
92
+
93
+ def writer
94
+ @writer ||= Messaging::Write::Substitute.new
95
+ end
96
+
97
+ module Start
98
+ def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
99
+ address ||= Address.build
100
+
101
+ instance = build address, *positional_arguments, **keyword_arguments, &block
102
+
103
+ thread = Actor::Start.(
104
+ instance,
105
+ address,
106
+ supervisor_address: supervisor_address
107
+ )
108
+
109
+ Destructure.(address, include, { :thread => thread, :actor => instance })
110
+ end
111
+ end
112
+ end
11
113
  end
@@ -0,0 +1,19 @@
1
+ module Actor
2
+ module Build
3
+ def build address, *positional_arguments, **keyword_arguments, &block
4
+ if keyword_arguments.empty?
5
+ instance = new *positional_arguments, &block
6
+ else
7
+ instance = new *positional_arguments, **keyword_arguments, &block
8
+ end
9
+
10
+ instance.address = address
11
+ instance.reader = Messaging::Read.build address
12
+ instance.writer = Messaging::Write.new
13
+
14
+ instance.configure
15
+
16
+ instance
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,37 @@
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
@@ -0,0 +1,45 @@
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
@@ -12,18 +12,17 @@ module Actor
12
12
  @assembly = assembly
13
13
  end
14
14
 
15
- def self.run &block
16
- self.address, thread = start include: %i(thread), &block
15
+ class << self
16
+ attr_accessor :address
17
17
 
18
- thread.join
19
- end
18
+ def run &assembly
19
+ self.address = Address.build
20
20
 
21
- def self.address
22
- @address ||= Address::None
23
- end
21
+ instance = build address, &assembly
24
22
 
25
- def self.address= address
26
- @address = address
23
+ thread = Start.(instance, address)
24
+ thread.join
25
+ end
27
26
  end
28
27
 
29
28
  handle :start do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ntl-actor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.pre3
4
+ version: 0.4.0.pre4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Ladd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2016-09-15 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Implementation of actor pattern for ruby designed for simplicity and
14
14
  frugality
@@ -20,6 +20,7 @@ files:
20
20
  - lib/actor.rb
21
21
  - lib/actor/actor.rb
22
22
  - lib/actor/address.rb
23
+ - lib/actor/build.rb
23
24
  - lib/actor/controls.rb
24
25
  - lib/actor/controls/actor.rb
25
26
  - lib/actor/controls/address.rb
@@ -31,17 +32,14 @@ files:
31
32
  - lib/actor/destructure.rb
32
33
  - lib/actor/duration.rb
33
34
  - lib/actor/future.rb
35
+ - lib/actor/handle_macro.rb
34
36
  - lib/actor/messages.rb
35
37
  - lib/actor/messaging/message.rb
36
38
  - lib/actor/messaging/read.rb
37
39
  - lib/actor/messaging/read/substitute.rb
38
40
  - lib/actor/messaging/write.rb
39
41
  - lib/actor/messaging/write/substitute.rb
40
- - lib/actor/module.rb
41
- - lib/actor/module/build.rb
42
- - lib/actor/module/handle_macro.rb
43
- - lib/actor/module/observers.rb
44
- - lib/actor/module/start.rb
42
+ - lib/actor/observers.rb
45
43
  - lib/actor/router.rb
46
44
  - lib/actor/start.rb
47
45
  - lib/actor/stream.rb
data/lib/actor/module.rb DELETED
@@ -1,87 +0,0 @@
1
- module Actor
2
- module Module
3
- def self.included cls
4
- cls.class_exec do
5
- extend Build
6
- extend HandleMacro
7
- extend Start
8
-
9
- include Observers
10
- end
11
- end
12
-
13
- attr_writer :address
14
- attr_writer :reader
15
- attr_writer :writer
16
-
17
- def configure
18
- end
19
-
20
- def continuations
21
- @continuations ||= []
22
- end
23
-
24
- def handle message
25
- method = handle? message
26
-
27
- return if method.nil?
28
-
29
- if method.arity == 0
30
- return_value = method.()
31
- else
32
- return_value = method.(message)
33
- end
34
-
35
- notify_observers message
36
-
37
- return_value
38
- end
39
-
40
- def handle_stop
41
- raise StopIteration
42
- end
43
-
44
- def handle? message
45
- method_name = HandleMacro::MethodName.get message
46
-
47
- if respond_to? method_name
48
- method method_name
49
- end
50
- end
51
-
52
- def next
53
- if continuations.empty?
54
- message = reader.(wait: true)
55
- else
56
- message = reader.(wait: false)
57
- message ||= continuations.shift
58
- end
59
-
60
- continuation_message = handle message
61
-
62
- if handle? continuation_message
63
- continuations << continuation_message
64
- end
65
- end
66
-
67
- def run_loop
68
- loop do
69
- self.next
70
- Thread.pass
71
- end
72
- end
73
- alias_method :start, :run_loop
74
-
75
- def address
76
- @address ||= Address::None
77
- end
78
-
79
- def reader
80
- @reader ||= Messaging::Read::Substitute.new
81
- end
82
-
83
- def writer
84
- @writer ||= Messaging::Write::Substitute.new
85
- end
86
- end
87
- end
@@ -1,21 +0,0 @@
1
- module Actor
2
- module Module
3
- module Build
4
- def build address, *positional_arguments, **keyword_arguments, &block
5
- if keyword_arguments.empty?
6
- instance = new *positional_arguments, &block
7
- else
8
- instance = new *positional_arguments, **keyword_arguments, &block
9
- end
10
-
11
- instance.address = address
12
- instance.reader = Messaging::Read.build address
13
- instance.writer = Messaging::Write.new
14
-
15
- instance.configure
16
-
17
- instance
18
- end
19
- end
20
- end
21
- end
@@ -1,39 +0,0 @@
1
- module Actor
2
- module Module
3
- module HandleMacro
4
- def handle_macro pattern, &action
5
- method_name = MethodName.get pattern
6
-
7
- define_method method_name, &action
8
- end
9
- alias_method :handle, :handle_macro
10
-
11
- module MethodName
12
- PATTERN = %r{(?:\A|[a-z0-9])[A-Z]}
13
-
14
- def self.get message_pattern
15
- case message_pattern
16
- when Class, String then
17
- message_name = message_pattern.to_s
18
-
19
- *, message_name = message_name.split '::'
20
-
21
- message_name.gsub! PATTERN do |str|
22
- str.downcase!
23
- str.insert 1, '_' if str.length == 2
24
- str
25
- end
26
-
27
- get message_name.to_sym
28
-
29
- when Symbol then
30
- :"handle_#{message_pattern}"
31
-
32
- else
33
- get message_pattern.class
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,47 +0,0 @@
1
- module Actor
2
- module Module
3
- module Observers
4
- def observe message_pattern, &callback
5
- handler_method = HandleMacro::MethodName.get message_pattern
6
-
7
- observer_id = callback.object_id
8
-
9
- record = Observer.new observer_id, handler_method, callback
10
-
11
- add_observer record
12
- end
13
-
14
- def add_observer record
15
- observers = observer_registry[record.handler_method]
16
-
17
- observers[record.observer_id] = record
18
- end
19
-
20
- def notify_observers message
21
- handler_method = HandleMacro::MethodName.get message
22
-
23
- observers = observer_registry[handler_method]
24
-
25
- observers.each_value.map do |record|
26
- callback = record.callback
27
-
28
- callback.(message)
29
- end
30
- end
31
-
32
- def remove_observer record
33
- observers = observer_registry[record.handler_method]
34
-
35
- observers.delete record.observer_id
36
- end
37
-
38
- def observer_registry
39
- @observer_registry ||= Hash.new do |hash, handler_method|
40
- hash[handler_method] = {}
41
- end
42
- end
43
-
44
- Observer = Struct.new :observer_id, :handler_method, :callback
45
- end
46
- end
47
- end
@@ -1,19 +0,0 @@
1
- module Actor
2
- module Module
3
- module Start
4
- def start *positional_arguments, address: nil, supervisor_address: nil, include: nil, **keyword_arguments, &block
5
- address ||= Address.build
6
-
7
- instance = build address, *positional_arguments, **keyword_arguments, &block
8
-
9
- thread = Actor::Start.(
10
- instance,
11
- address,
12
- supervisor_address: supervisor_address
13
- )
14
-
15
- Destructure.(address, include, { :thread => thread, :actor => instance })
16
- end
17
- end
18
- end
19
- end