Skip to content

Instantly share code, notes, and snippets.

@francescoagati
Created October 29, 2012 03:07
Show Gist options
  • Save francescoagati/3971257 to your computer and use it in GitHub Desktop.
Save francescoagati/3971257 to your computer and use it in GitHub Desktop.
an example of actor model in opal client side
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)
@francescoagati
Copy link
Author

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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment