Created
October 29, 2012 03:07
-
-
Save francescoagati/3971257 to your computer and use it in GitHub Desktop.
an example of actor model in opal client side
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Timer | |
def initialize(delay=100) | |
@delay=delay | |
end | |
def run | |
end | |
def method(name) | |
obj=self | |
Proc.new { obj.send name } | |
end | |
def start | |
@timer_id=`setInterval(#{method(:run)},#{@delay})` | |
end | |
def stop | |
`clearInterval(#{@timer_id})` | |
end | |
end | |
class Actor < Timer | |
def initialize(delay) | |
@mailbox=[] | |
super(delay) | |
end | |
def mailbox | |
@mailbox | |
end | |
def message(name,*args) | |
@mailbox << [name,args] | |
end | |
def run | |
unless mailbox.length == 0 | |
msg= mailbox.pop | |
puts msg | |
send msg[0], *msg[1] | |
end | |
end | |
end | |
class Counter < Actor | |
attr_accessor :counter | |
def initialize(delay) | |
@counter=0 | |
super(delay) | |
end | |
def incr | |
@counter=@counter + 1 | |
puts counter | |
end | |
end | |
cnt=Counter.new | |
cnt.start | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) | |
cnt.message(:incr) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
for running
http://opalrb.org/try/#code:class%20Timer%0A%20%20%0A%20%20def%20initialize(delay%3D100)%0A%20%20%20%20%40delay%3Ddelay%0A%20%20end%0A%20%20%0A%20%20%0A%20%20def%20run%20%0A%20%20end%0A%20%20%0A%20%20%0A%20%20def%20method(name)%0A%20%20%20%20obj%3Dself%0A%20%20%20%20Proc.new%20%7B%20obj.send%20name%20%7D%0A%20%20end%0A%20%20%0A%20%20def%20start%0A%20%20%20%20%40timer_id%3D%60setInterval(%23%7Bmethod(%3Arun)%7D%2C%23%7B%40delay%7D)%60%0A%20%20end%0A%20%20%0A%20%20%0A%20%20def%20stop%0A%20%20%20%20%60clearInterval(%23%7B%40timer_id%7D)%60%0A%20%20end%0A%20%20%0Aend%0A%0A%0Aclass%20Actor%20%3C%20Timer%0A%20%20%0A%20%20%0A%20%20def%20initialize(delay)%0A%20%20%20%20%40mailbox%3D%5B%5D%0A%20%20%20%20super(delay)%0A%20%20end%0A%20%0A%20%20%20def%20mailbox%0A%20%20%20%20%40mailbox%0A%20%20end%0A%20%0A%20%20def%20message(name%2C*args)%0A%20%20%20%20%40mailbox%20%3C%3C%20%5Bname%2Cargs%5D%0A%20%20%20%20%0A%20%20end%0A%20%20%0A%20%20def%20run%0A%20%20%20%20unless%20mailbox.length%20%3D%3D%200%0A%20%20%20%20%20%20msg%3D%20mailbox.pop%0A%20%20%20%20%20%20puts%20msg%0A%20%20%20%20%20%20send%20msg%5B0%5D%2C%20*msg%5B1%5D%0A%20%20%20%20end%0A%20%20end%0A%20%20%0A%20%20%0Aend%0A%0Aclass%20Counter%20%3C%20Actor%0A%20%20%0A%20%20attr_accessor%20%3Acounter%0A%20%20%0A%20%20def%20initialize(delay)%0A%20%20%20%20%40counter%3D0%0A%20%20%20%20super(delay)%0A%20%20end%0A%20%20%0A%20%20def%20incr%0A%20%20%20%20%40counter%3D%40counter%20%2B%201%0A%20%20%20%20puts%20counter%0A%20%20end%0A%20%20%0A%20%20%0Aend%0A%0A%0Acnt%3DCounter.new%0Acnt.start%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)%0Acnt.message(%3Aincr)