@@ -21,57 +21,70 @@ package ch6
21
21
Consider using Rx subjects for this task.
22
22
*/
23
23
24
- object Ex4 extends App {
24
+ import rx . lang . scala . _
25
25
26
- import rx . lang . scala . _
26
+ object Ex4 extends App {
27
27
28
28
implicit class ObserverableAdditional [T ](val self : Observable [T ]) extends AnyVal {
29
29
30
30
def toSignal : Signal [T ] = {
31
- val s = new Signal [T ]
32
- self.last.subscribe(s.subject)
33
- s
31
+ new Signal [T ](self)
34
32
}
35
33
36
34
}
37
35
38
36
class Signal [T ] {
39
37
40
- def this (t: T ) {
41
- this ()
42
- a = t
43
- }
38
+ var lastEvent : T = _
44
39
45
- var a : T = _
40
+ var observable : Observable [ T ] = _
46
41
47
42
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
+ }
48
51
49
- subject.subscribe(a = _)
52
+ def apply () : T = lastEvent
50
53
51
- def apply (): T = a
54
+ def map [S ](f : T => S ): Signal [S ] =
55
+ this .observable.map(f).toSignal
52
56
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
54
59
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
56
62
57
- def scan [S ](z : S )(f : (S , T ) => S ): Signal [S ] = new Signal [S ](f(z,a))
58
63
}
59
64
60
65
// test
61
- val s1 = Observable .items[String ](" A" ," B" ," C" ).toSignal
62
- log(s " element = ${s1()}" )
66
+ def test = {
63
67
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" ))
65
70
66
- val sMap = s1.map( _+ " ~ " )
67
- log( s " sMap: element = ${sMap()} " )
71
+ val s1 = o.toSignal
72
+ val s2 = o2.toSignal
68
73
69
- val sZip = s1.zip(s2 )
70
- log(s " sZip : element = ${sZip ()}" )
74
+ log( s " s1: element = ${s1()} " )
75
+ log(s " s2 : element = ${s2 ()}" )
71
76
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 ()}" )
74
79
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
+ }
75
86
87
+ test
88
+ Thread .sleep(5000 )
76
89
77
90
}
0 commit comments