Skip to content

Commit a11d35d

Browse files
committed
fixed error (the resulting signal will not emit mapped events after creating)
1 parent cbbc39e commit a11d35d

File tree

1 file changed

+37
-24
lines changed
  • src/main/scala/org/learningconcurrency/exercises/ch6

1 file changed

+37
-24
lines changed

src/main/scala/org/learningconcurrency/exercises/ch6/Ex4.scala

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,57 +21,70 @@ package ch6
2121
Consider using Rx subjects for this task.
2222
*/
2323

24-
object Ex4 extends App {
24+
import rx.lang.scala._
2525

26-
import rx.lang.scala._
26+
object Ex4 extends App {
2727

2828
implicit class ObserverableAdditional[T](val self:Observable[T]) extends AnyVal {
2929

3030
def toSignal:Signal[T] = {
31-
val s = new Signal[T]
32-
self.last.subscribe(s.subject)
33-
s
31+
new Signal[T](self)
3432
}
3533

3634
}
3735

3836
class Signal[T] {
3937

40-
def this(t:T) {
41-
this()
42-
a = t
43-
}
38+
var lastEvent:T = _
4439

45-
var a:T = _
40+
var observable: Observable[T] = _
4641

4742
val subject = Subject[T]()
43+
subject.subscribe(lastEvent = _)
44+
45+
def this(observable: Observable[T]) = {
46+
this()
47+
48+
this.observable = observable.last
49+
this.observable.subscribe(subject)
50+
}
4851

49-
subject.subscribe(a = _)
52+
def apply(): T = lastEvent
5053

51-
def apply(): T = a
54+
def map[S](f: T => S): Signal[S] =
55+
this.observable.map(f).toSignal
5256

53-
def map[S](f: T => S): Signal[S] = new Signal[S](f(a))
57+
def zip[S](that: Signal[S]): Signal[(T, S)] =
58+
this.observable.zip(that.observable).toSignal
5459

55-
def zip[S](that: Signal[S]): Signal[(T, S)] = new Signal[(T,S)]((a,that.a))
60+
def scan[S](z: S)(f: (S, T) => S):Signal[S] =
61+
this.observable.scan(z)(f).toSignal
5662

57-
def scan[S](z: S)(f: (S, T) => S):Signal[S] = new Signal[S](f(z,a))
5863
}
5964

6065
//test
61-
val s1 = Observable.items[String]("A","B","C").toSignal
62-
log(s"element = ${s1()}")
66+
def test = {
6367

64-
val s2 = Observable.items[Int](1,2,3).toSignal
68+
val o = Observable.from(List(1,2,3,4,5))
69+
val o2 = Observable.from(List("A","B","C","D","E"))
6570

66-
val sMap = s1.map(_+"~")
67-
log(s"sMap: element = ${sMap()}")
71+
val s1 = o.toSignal
72+
val s2 =o2.toSignal
6873

69-
val sZip = s1.zip(s2)
70-
log(s"sZip: element = ${sZip()}")
74+
log(s"s1: element = ${s1()}")
75+
log(s"s2: element = ${s2()}")
7176

72-
val sScan = s2.scan(10)((s,t)=>s+t)
73-
log(s"sScan: element = ${sScan()}")
77+
val sMap = s1.map(_+"~")
78+
log(s"sMap: element = ${sMap()}")
7479

80+
val sZip = s1.zip(s2)
81+
log(s"sZip: element = ${sZip()}")
82+
83+
val sScan = s1.scan(2)((s,t)=>s*t)
84+
log(s"sScan: element = ${sScan()}")
85+
}
7586

87+
test
88+
Thread.sleep(5000)
7689

7790
}

0 commit comments

Comments
 (0)