This page is no longer maintained — Please continue to the home page at www.scala-lang.org

actor react loop abstraction

2 replies
Sean Buttinger
Joined: 2010-04-11,
User offline. Last seen 42 years 45 weeks ago.

hi,

last week i started my first scala project and, coming from a ruby and
java background, am very impressed by its powerful abstractions.
unfortunately, i can't figure out how to abstract away an actor and
its react loop that i use for event listening.

i want to replace

env.addObserver(actor {
loop {
react {
case EnvironmentChangeMessage(parameter, value) =>
handleEnvironmentChange(parameter, value)
}
}
})

with something like:

env.observe {
case EnvironmentChangeMessage(parameter, value) =>
handleEnvironmentChange(parameter, value)
}

env is an instance of a class that extends the following Observable trait:

case class EnvironmentChangeMessage(val parameter: Symbol, val value:
Double) extends ObservableChangedMessage()

class Environment() extends Observable {
// ...
}

case class ObservableChangedMessage()

trait Observable {

val observers: ListBuffer[Actor] = new ListBuffer()

def addObserver(observer: Actor) {
observers += observer
}

def notifyObservers(msg: ObservableChangedMessage) {
observers.foreach { observer => observer ! msg }
}
}

the method observe probably looks somehow like this, but can't fill in the gaps.

def observe(__?__) {
addObserver(actor {
loop {
react {
__?__
}
}
})
}

any help or links are highly appreciated. thanks in advance,

sean

Sean Buttinger
Joined: 2010-04-11,
User offline. Last seen 42 years 45 weeks ago.
Re: actor react loop abstraction

i guess i figured it out:

def observe(f: PartialFunction[Any, Unit]) {
addObserver(actor {
loop {
react {
f
}
}
})
}

right?

cheers,
sean

On Sun, Apr 11, 2010 at 4:07 PM, Sean Buttinger
wrote:
> hi,
>
> last week i started my first scala project and, coming from a ruby and
> java background, am very impressed by its powerful abstractions.
> unfortunately, i can't figure out how to abstract away an actor and
> its react loop that i use for event listening.
>
> i want to replace
>
>        env.addObserver(actor {
>                loop {
>                        react {
>                                case EnvironmentChangeMessage(parameter, value) =>
> handleEnvironmentChange(parameter, value)
>                        }
>                }
>        })
>
> with something like:
>
>         env.observe {
>                case EnvironmentChangeMessage(parameter, value) =>
> handleEnvironmentChange(parameter, value)
>         }
>
> env is an instance of a class that extends the following Observable trait:
>
>        case class EnvironmentChangeMessage(val parameter: Symbol, val value:
> Double) extends ObservableChangedMessage()
>
>        class Environment() extends Observable {
>                // ...
>        }
>
>        case class ObservableChangedMessage()
>
>        trait Observable {
>
>                val observers: ListBuffer[Actor] = new ListBuffer()
>
>                def addObserver(observer: Actor) {
>                        observers += observer
>                }
>
>                def notifyObservers(msg: ObservableChangedMessage) {
>                        observers.foreach { observer => observer ! msg }
>                }
>        }
>
>
> the method observe probably looks somehow like this, but can't fill in the gaps.
>
>        def observe(__?__) {
>                addObserver(actor {
>                        loop {
>                                react {
>                                        __?__
>                                }
>                        }
>                })
>        }
>
> any help or links are highly appreciated. thanks in advance,
>
> sean
>
>
>
>
>
> --
> Email [em'aj; germ.-fr.]: Schmelzüberzug als Oberflächenschutz oder Verzierung
>

dcsobral
Joined: 2009-04-23,
User offline. Last seen 38 weeks 5 days ago.
Re: Re: actor react loop abstraction
"react f" should be enough.

On Sun, Apr 11, 2010 at 11:09 AM, Sean Buttinger <sean.buttinger@gmail.com> wrote:
i guess i figured it out:

       def observe(f: PartialFunction[Any, Unit]) {
               addObserver(actor {
                       loop {
                               react {
                                       f
                               }
                       }
               })
       }

right?

cheers,
sean

On Sun, Apr 11, 2010 at 4:07 PM, Sean Buttinger
<sean.buttinger@gmail.com> wrote:
> hi,
>
> last week i started my first scala project and, coming from a ruby and
> java background, am very impressed by its powerful abstractions.
> unfortunately, i can't figure out how to abstract away an actor and
> its react loop that i use for event listening.
>
> i want to replace
>
>        env.addObserver(actor {
>                loop {
>                        react {
>                                case EnvironmentChangeMessage(parameter, value) =>
> handleEnvironmentChange(parameter, value)
>                        }
>                }
>        })
>
> with something like:
>
>         env.observe {
>                case EnvironmentChangeMessage(parameter, value) =>
> handleEnvironmentChange(parameter, value)
>         }
>
> env is an instance of a class that extends the following Observable trait:
>
>        case class EnvironmentChangeMessage(val parameter: Symbol, val value:
> Double) extends ObservableChangedMessage()
>
>        class Environment() extends Observable {
>                // ...
>        }
>
>        case class ObservableChangedMessage()
>
>        trait Observable {
>
>                val observers: ListBuffer[Actor] = new ListBuffer()
>
>                def addObserver(observer: Actor) {
>                        observers += observer
>                }
>
>                def notifyObservers(msg: ObservableChangedMessage) {
>                        observers.foreach { observer => observer ! msg }
>                }
>        }
>
>
> the method observe probably looks somehow like this, but can't fill in the gaps.
>
>        def observe(__?__) {
>                addObserver(actor {
>                        loop {
>                                react {
>                                        __?__
>                                }
>                        }
>                })
>        }
>
> any help or links are highly appreciated. thanks in advance,
>
> sean
>
>
>
>
>
> --
> Email [em'aj; germ.-fr.]: Schmelzüberzug als Oberflächenschutz oder Verzierung
>



--
Email [em'aj; germ.-fr.]: Schmelzüberzug als Oberflächenschutz oder Verzierung



--
Daniel C. Sobral

I travel to the future all the time.

Copyright © 2012 École Polytechnique Fédérale de Lausanne (EPFL), Lausanne, Switzerland