ntl-actor 0.4.0.pre3 → 0.4.0.pre4

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