// An immutable version of Signal[A]. Based on the concept of state transformations. case class SignalImmutable[A](value: A, listeners: Seq[Function[A, Unit]] = Seq()) object SignalImmutable { def set[A](newValue: A)(signal: SignalImmutable[A]): SignalImmutable[A] = { signal.listeners.foreach(_(newValue)) signal.copy(value = newValue) } def get[A](signal: SignalImmutable[A]): A = signal.value def listen[A](listener: Function[A, Unit])(signal: SignalImmutable[A]): SignalImmutable[A] = { signal.copy(listeners = signal.listeners :+ listener) } } object Foo extends App { // New instances after every state change. Ugly, yes. val sig = SignalImmutable(1) val sig2 = SignalImmutable.listen({v: Int => println(v)})(sig) val sig3 = SignalImmutable.set(5)(sig2) }