1
- require 'algebrick'
2
1
require 'atomic'
3
2
require 'logger'
4
3
5
4
module Concurrent
6
5
module Actress
7
6
Error = Class . new ( StandardError )
8
7
8
+ module TypeCheck
9
+ # taken from Algebrick
10
+
11
+ def Type? ( value , *types )
12
+ types . any? { |t | value . is_a? t }
13
+ end
14
+
15
+ def Type! ( value , *types )
16
+ Type? ( value , *types ) or
17
+ TypeCheck . error ( value , 'is not' , types )
18
+ value
19
+ end
20
+
21
+ def Match? ( value , *types )
22
+ types . any? { |t | t === value }
23
+ end
24
+
25
+ def Match! ( value , *types )
26
+ Match? ( value , *types ) or
27
+ TypeCheck . error ( value , 'is not matching' , types )
28
+ value
29
+ end
30
+
31
+ def Child? ( value , *types )
32
+ Type? ( value , Class ) &&
33
+ types . any? { |t | value <= t }
34
+ end
35
+
36
+ def Child! ( value , *types )
37
+ Child? ( value , *types ) or
38
+ TypeCheck . error ( value , 'is not child' , types )
39
+ value
40
+ end
41
+
42
+ private
43
+
44
+ def self . error ( value , message , types )
45
+ raise TypeError ,
46
+ "Value (#{ value . class } ) '#{ value } ' #{ message } any of: #{ types . join ( '; ' ) } ."
47
+ end
48
+ end
49
+
9
50
class ActressTerminated < Error
10
- include Algebrick :: TypeCheck
51
+ include TypeCheck
11
52
12
53
def initialize ( reference )
13
54
Type! reference , Reference
@@ -40,8 +81,7 @@ def reference
40
81
end
41
82
42
83
class Reference
43
- include Algebrick ::TypeCheck
44
- include Algebrick ::Types
84
+ include TypeCheck
45
85
include CoreDelegations
46
86
47
87
attr_reader :core
@@ -63,9 +103,7 @@ def ask(message, ivar = IVar.new)
63
103
end
64
104
65
105
def message ( message , ivar = nil )
66
- core . on_envelope Envelope [ message ,
67
- ivar ? Some [ IVar ] [ ivar ] : None ,
68
- Actress . current ? Some [ Reference ] [ Actress . current ] : None ]
106
+ core . on_envelope Envelope . new ( message , ivar , Actress . current )
69
107
return ivar || self
70
108
end
71
109
@@ -80,26 +118,30 @@ def ==(other)
80
118
end
81
119
end
82
120
83
- include Algebrick ::Types
121
+ Envelope = Struct . new :message , :ivar , :sender do
122
+ include TypeCheck
84
123
85
- Envelope = Algebrick . type do
86
- fields! message : Object ,
87
- ivar : Maybe [ IVar ] ,
88
- sender : Maybe [ Reference ]
89
- end
124
+ def initialize ( message , ivar , sender )
125
+ super message ,
126
+ ( Type! ivar , IVar , NilClass ) ,
127
+ ( Type! sender , Reference , NilClass )
128
+ end
90
129
91
- module Envelope
92
130
def sender_path
93
- sender . maybe { |reference | reference . path } || 'outside-actress'
131
+ if sender
132
+ sender . path
133
+ else
134
+ 'outside-actress'
135
+ end
94
136
end
95
137
96
138
def reject! ( error )
97
- ivar . maybe { | v | v . fail error }
139
+ ivar . fail error unless ivar . nil?
98
140
end
99
141
end
100
142
101
143
class Core
102
- include Algebrick :: TypeCheck
144
+ include TypeCheck
103
145
104
146
attr_reader :reference , :name , :path , :logger , :parent_core
105
147
private :parent_core
@@ -190,10 +232,10 @@ def receive_envelope
190
232
logger . debug "received #{ envelope . message } from #{ envelope . sender_path } "
191
233
192
234
result = @actress . on_envelope envelope
193
- envelope . ivar . maybe { | iv | iv . set result }
235
+ envelope . ivar . set result unless envelope . ivar . nil?
194
236
rescue => error
195
237
logger . error error
196
- envelope . ivar . maybe { | iv | iv . fail error }
238
+ envelope . ivar . fail error unless envelope . ivar . nil?
197
239
ensure
198
240
@receive_envelope_scheduled = false
199
241
process?
@@ -235,9 +277,8 @@ def reject_envelope(envelope)
235
277
end
236
278
237
279
module ActorContext
238
- include Algebrick ::TypeCheck
239
- extend Algebrick ::TypeCheck
240
- include Algebrick ::Matching
280
+ include TypeCheck
281
+ extend TypeCheck
241
282
include CoreDelegations
242
283
243
284
attr_reader :core
0 commit comments