1
1
package rx.lang.kotlin
2
2
3
3
import rx.Subscriber
4
- import rx.observers.SerializedSubscriber
5
4
import rx.exceptions.OnErrorNotImplementedException
5
+ import rx.observers.SerializedSubscriber
6
+ import java.util.ArrayList
7
+
8
+ public class FunctionSubscriber <T >() : Subscriber<T>() {
9
+ private val onCompletedFunctions = ArrayList < () -> Unit > ()
10
+ private val onErrorFunctions = ArrayList < (e: Throwable ) -> Unit > ()
11
+ private val onNextFunctions = ArrayList < (value: T ) -> Unit > ()
12
+ private val onStartFunctions = ArrayList < () -> Unit > ()
13
+
14
+ override fun onCompleted () = onCompletedFunctions.forEach { it() }
15
+
16
+ override fun onError (e : Throwable ? ) = (e ? : RuntimeException (" exception is unknown" )).let { ex ->
17
+ if (onErrorFunctions.isEmpty()) {
18
+ throw OnErrorNotImplementedException (ex)
19
+ } else {
20
+ onErrorFunctions.forEach { it(ex) }
21
+ }
22
+ }
6
23
7
- public class FunctionSubscriber <T >(onCompletedFunction : () -> Unit , onErrorFunction : (e : Throwable ) -> Unit , onNextFunction : (value : T ) -> Unit , onStartFunction : () -> Unit ) : Subscriber<T>() {
8
- private val onCompletedFunction: () -> Unit = onCompletedFunction
9
- private val onErrorFunction: (e : Throwable ) -> Unit = onErrorFunction
10
- private val onNextFunction: (value : T ) -> Unit = onNextFunction
11
- private val onStartFunction : () -> Unit = onStartFunction
24
+ override fun onNext (t : T ) = onNextFunctions.forEach { it(t) }
12
25
13
- override fun onCompleted () = onCompletedFunction()
26
+ override fun onStart () = onStartFunctions.forEach { it() }
14
27
15
- override fun onError (e : Throwable ? ) = onErrorFunction(e ? : RuntimeException (" exception is unknown" ))
28
+ fun onCompleted (onCompletedFunction : () -> Unit ): FunctionSubscriber <T > = copy { onCompletedFunctions.add(onCompletedFunction) }
29
+ fun onError (onErrorFunction : (t: Throwable ) -> Unit ): FunctionSubscriber <T > = copy { onErrorFunctions.add(onErrorFunction) }
30
+ fun onNext (onNextFunction : (t: T ) -> Unit ): FunctionSubscriber <T > = copy { onNextFunctions.add(onNextFunction) }
31
+ fun onStart (onStartFunction : () -> Unit ) : FunctionSubscriber <T > = copy { onStartFunctions.add(onStartFunction) }
16
32
17
- override fun onNext (t : T ) = onNextFunction(t)
33
+ private fun copy (block : FunctionSubscriber <T >.() -> Unit ): FunctionSubscriber <T > {
34
+ val newSubscriber = FunctionSubscriber <T >()
35
+ newSubscriber.onCompletedFunctions.addAll(onCompletedFunctions)
36
+ newSubscriber.onErrorFunctions.addAll(onErrorFunctions)
37
+ newSubscriber.onNextFunctions.addAll(onNextFunctions)
38
+ newSubscriber.onStartFunctions.addAll(onStartFunctions)
18
39
19
- override fun onStart () = onStartFunction ()
40
+ newSubscriber.block ()
20
41
21
- fun onCompleted (onCompletedFunction : () -> Unit ) : FunctionSubscriber <T > = FunctionSubscriber (onCompletedFunction, this .onErrorFunction, this .onNextFunction, this .onStartFunction)
22
- fun onError (onErrorFunction : (t : Throwable ) -> Unit ) : FunctionSubscriber <T > = FunctionSubscriber (this .onCompletedFunction, onErrorFunction, this .onNextFunction, this .onStartFunction)
23
- fun onNext (onNextFunction : (t : T ) -> Unit ) : FunctionSubscriber <T > = FunctionSubscriber (this .onCompletedFunction, this .onErrorFunction, onNextFunction, this .onStartFunction)
24
- fun onStart (onStartFunction : () -> Unit ) : FunctionSubscriber <T > = FunctionSubscriber (this .onCompletedFunction, this .onErrorFunction, this .onNextFunction, onStartFunction)
42
+ return newSubscriber
43
+ }
25
44
}
26
45
27
46
public class FunctionSubscriberModifier <T >(init : FunctionSubscriber <T > = subscriber()) {
@@ -34,5 +53,5 @@ public class FunctionSubscriberModifier<T>(init: FunctionSubscriber<T> = subscri
34
53
fun onStart (onStartFunction : () -> Unit ) : Unit { subscriber = subscriber.onStart(onStartFunction) }
35
54
}
36
55
37
- public fun <T > subscriber (): FunctionSubscriber <T > = FunctionSubscriber ({}, { throw OnErrorNotImplementedException (it)}, {}, {} )
38
- public fun <T > Subscriber<T>.synchronized () : Subscriber <T > = SerializedSubscriber (this )
56
+ public fun <T > subscriber (): FunctionSubscriber <T > = FunctionSubscriber ()
57
+ public fun <T > Subscriber<T>.synchronized (): Subscriber <T > = SerializedSubscriber (this )
0 commit comments