end
class WakeUpNode
-special Node
+ super Node
fun wake_up is abstract
# Wake up the node
fun wake_up_in(d: Int)
_scheduler.add_event(self, d)
end
var _scheduler: Scheduler
+ init do end
end
class NodeSource
-special Node
+ super Node
var _nexts: nullable ArraySet[NodeSink] = null
fun attach(n: NodeSink)
# Add the sink `n' the the connected nodes
# Do nothing if `n' is already connected
do
- assert n != null
# Create the collection if needed
if _nexts == null then
_nexts = new ArraySet[NodeSink]
# Remove the sink `n' from the connected nodes
# Do nothing if `n' is not connected
do
- assert n != null
_nexts.remove(n)
end
end
class NodeSink
-special Node
+ super Node
fun recieve(n: NodeSource) is abstract
# the `n' has emeted a signal
end
fun run_for(time_limit: Int)
do
- while true do
+ loop
var node = next_event
if _time > time_limit then
print("Time limit.")
#
class BeepSource
-special NodeSource
-special WakeUpNode
+ super NodeSource
+ super WakeUpNode
redef fun wake_up
do
send
end
class CountSink
-special NodeSink
- readable var _count: Int = 0
+ super NodeSink
+ var count: Int = 0
redef fun recieve(n: NodeSource)
do
- _count = _count + 1
+ count = count + 1
end
end
class SimpleCountSink
-special CountSink
+ super CountSink
init(name: String)
do
end
class NodeAlternate
-special NodeSink
-special NodeSource
+ super NodeSink
+ super NodeSource
var _last: nullable NodeSource
redef fun recieve(n: NodeSource)
do
end
class NodeEat
-special CountSink
-special NodeSource
+ super CountSink
+ super NodeSource
var _limit: Int
redef fun recieve(n: NodeSource)
do
- var c = _count + 1
+ var c = count + 1
if c >= _limit then
- _count = 0
+ count = 0
send
else
- _count = c
+ count = c
end
end
end
class NodeDelay
-special NodeSource
-special NodeSink
-special WakeUpNode
+ super NodeSource
+ super NodeSink
+ super WakeUpNode
var _delay: Int
redef fun recieve(n: NodeSource)
do