Skip to content

Commit 6887f78

Browse files
committed
Remove Algebrick dependency
1 parent e6d4001 commit 6887f78

File tree

3 files changed

+74
-36
lines changed

3 files changed

+74
-36
lines changed

Gemfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ source 'https://rubygems.org'
33
gemspec
44

55
group :actress do
6-
gem 'algebrick'
76
gem 'atomic'
87
end
98

lib/concurrent/actress.rb

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,54 @@
1-
require 'algebrick'
21
require 'atomic'
32
require 'logger'
43

54
module Concurrent
65
module Actress
76
Error = Class.new(StandardError)
87

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+
950
class ActressTerminated < Error
10-
include Algebrick::TypeCheck
51+
include TypeCheck
1152

1253
def initialize(reference)
1354
Type! reference, Reference
@@ -40,8 +81,7 @@ def reference
4081
end
4182

4283
class Reference
43-
include Algebrick::TypeCheck
44-
include Algebrick::Types
84+
include TypeCheck
4585
include CoreDelegations
4686

4787
attr_reader :core
@@ -63,9 +103,7 @@ def ask(message, ivar = IVar.new)
63103
end
64104

65105
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)
69107
return ivar || self
70108
end
71109

@@ -80,26 +118,30 @@ def ==(other)
80118
end
81119
end
82120

83-
include Algebrick::Types
121+
Envelope = Struct.new :message, :ivar, :sender do
122+
include TypeCheck
84123

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
90129

91-
module Envelope
92130
def sender_path
93-
sender.maybe { |reference| reference.path } || 'outside-actress'
131+
if sender
132+
sender.path
133+
else
134+
'outside-actress'
135+
end
94136
end
95137

96138
def reject!(error)
97-
ivar.maybe { |v| v.fail error }
139+
ivar.fail error unless ivar.nil?
98140
end
99141
end
100142

101143
class Core
102-
include Algebrick::TypeCheck
144+
include TypeCheck
103145

104146
attr_reader :reference, :name, :path, :logger, :parent_core
105147
private :parent_core
@@ -190,10 +232,10 @@ def receive_envelope
190232
logger.debug "received #{envelope.message} from #{envelope.sender_path}"
191233

192234
result = @actress.on_envelope envelope
193-
envelope.ivar.maybe { |iv| iv.set result }
235+
envelope.ivar.set result unless envelope.ivar.nil?
194236
rescue => error
195237
logger.error error
196-
envelope.ivar.maybe { |iv| iv.fail error }
238+
envelope.ivar.fail error unless envelope.ivar.nil?
197239
ensure
198240
@receive_envelope_scheduled = false
199241
process?
@@ -235,9 +277,8 @@ def reject_envelope(envelope)
235277
end
236278

237279
module ActorContext
238-
include Algebrick::TypeCheck
239-
extend Algebrick::TypeCheck
240-
include Algebrick::Matching
280+
include TypeCheck
281+
extend TypeCheck
241282
include CoreDelegations
242283

243284
attr_reader :core

spec/concurrent/actress_spec.rb

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
module Concurrent
66

77
describe Actress do
8-
Child = Algebrick.atom
9-
Terminate = Algebrick.atom
10-
118
class Ping
129
include Actress::ActorContext
1310

@@ -16,14 +13,15 @@ def initialize(queue)
1613
end
1714

1815
def on_message(message)
19-
match message,
20-
on(Terminate) { terminate! },
21-
on(Child) { spawn Ping, :pong, @queue },
22-
(on(any) do
23-
@queue << message
24-
message
25-
end)
26-
16+
case message
17+
when :terminate
18+
terminate!
19+
when :child
20+
spawn Ping, :pong, @queue
21+
else
22+
@queue << message
23+
message
24+
end
2725
end
2826
end
2927

@@ -38,13 +36,13 @@ def on_message(message)
3836
actor.parent.should eq Actress::ROOT
3937
Actress::ROOT.path.should eq '/'
4038
actor.path.should eq '/ping'
41-
child = actor.ask(Child).value
39+
child = actor.ask(:child).value
4240
child.path.should eq '/ping/pong'
4341
queue.clear
4442
child.ask(3)
4543
queue.pop.should eq 3
4644

47-
actor << Terminate
45+
actor << :terminate
4846
actor.ask(:blow_up).wait.rejected?.should be_true
4947
end
5048
end

0 commit comments

Comments
 (0)