Skip to content
This repository was archived by the owner on Dec 30, 2020. It is now read-only.

Commit edb9bac

Browse files
author
Mikolaj Leszczynski
authored
Merge pull request #81 from babylonhealth/orbit2-api-improvements
[PDT-158] Orbit2 api improvements
2 parents 1f2fab3 + 6116ae6 commit edb9bac

File tree

32 files changed

+690
-499
lines changed

32 files changed

+690
-499
lines changed

.idea/codeStyles/Project.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

orbit-2-core/src/main/java/com/babylon/orbit2/BasePlugin.kt

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ internal class Reduce<S : Any, E : Any>(val block: Context<S, E>.() -> Any) :
3030
Operator<S, E>
3131

3232
data class SideEffectContext<S : Any, SE : Any, E : Any>(
33-
override val state: S,
34-
override val event: E,
35-
private val postSideEffect: (SE) -> Unit
36-
) : Context<S, E> {
33+
val state: S,
34+
val event: E,
35+
val postSideEffect: (SE) -> Unit
36+
) {
3737
fun post(event: SE) {
3838
postSideEffect(event)
3939
}
@@ -68,28 +68,32 @@ object BasePlugin : OrbitPlugin {
6868
containerContext: OrbitPlugin.ContainerContext<S, SE>,
6969
flow: Flow<E>,
7070
operator: Operator<S, E>,
71-
context: (event: E) -> Context<S, E>
71+
createContext: (event: E) -> Context<S, E>
7272
): Flow<Any> {
73+
@Suppress("UNCHECKED_CAST")
7374
return when (operator) {
7475
is Transform<*, *, *> -> flow.map {
75-
@Suppress("UNCHECKED_CAST")
7676
with(operator as Transform<S, E, Any>) {
77-
context(it).block()
77+
createContext(it).block()
7878
}
7979
}
8080
is SideEffect<*, *, *> -> flow.onEach {
8181
with(operator as SideEffect<S, SE, E>) {
82-
val baseContext = context(it)
83-
SideEffectContext(
84-
baseContext.state,
85-
baseContext.event,
86-
containerContext.postSideEffect
87-
).block()
82+
createContext(it).let {
83+
SideEffectContext(
84+
it.state,
85+
it.event,
86+
containerContext.postSideEffect
87+
)
88+
}
89+
.block()
8890
}
8991
}
9092
is Reduce -> flow.onEach {
9193
with(operator) {
92-
containerContext.setState { context(it).block() as S }
94+
containerContext.setState {
95+
createContext(it).block() as S
96+
}
9397
}
9498
}
9599
else -> flow

orbit-2-core/src/main/java/com/babylon/orbit2/Container.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ package com.babylon.orbit2
1818

1919
interface Container<STATE : Any, SIDE_EFFECT : Any> {
2020
val currentState: STATE
21-
val orbit: Stream<STATE>
22-
val sideEffect: Stream<SIDE_EFFECT>
23-
fun <EVENT : Any> orbit(
24-
event: EVENT,
25-
init: Builder<STATE, SIDE_EFFECT, EVENT>.() -> Builder<STATE, SIDE_EFFECT, *>
21+
val stateStream: Stream<STATE>
22+
val sideEffectStream: Stream<SIDE_EFFECT>
23+
24+
fun orbit(
25+
init: Builder<STATE, SIDE_EFFECT, Unit>.() -> Builder<STATE, SIDE_EFFECT, *>
2626
)
2727

2828
companion object {

orbit-2-core/src/main/java/com/babylon/orbit2/Context.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,4 @@
1616

1717
package com.babylon.orbit2
1818

19-
interface Context<S : Any, E : Any> {
20-
val state: S
21-
val event: E
22-
}
19+
data class Context<S : Any, E : Any>(val state: S, val event: E)

orbit-2-core/src/main/java/com/babylon/orbit2/Host.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ package com.babylon.orbit2
1919
interface Host<STATE : Any, SIDE_EFFECT : Any> {
2020
val container: Container<STATE, SIDE_EFFECT>
2121

22-
fun <EVENT : Any> orbit(event: EVENT, init: Builder<STATE, SIDE_EFFECT, EVENT>.() -> Builder<STATE, SIDE_EFFECT, *>) =
23-
container.orbit(event, init)
24-
2522
fun orbit(init: Builder<STATE, SIDE_EFFECT, Unit>.() -> Builder<STATE, SIDE_EFFECT, *>) =
26-
container.orbit(Unit, init)
23+
container.orbit(init)
2724
}

orbit-2-core/src/main/java/com/babylon/orbit2/LazyCreateContainerDecorator.kt

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,25 +28,24 @@ class LazyCreateContainerDecorator<STATE : Any, SIDE_EFFECT : Any>(
2828
override val currentState: STATE
2929
get() = actual.currentState
3030

31-
override val orbit: Stream<STATE>
31+
override val stateStream: Stream<STATE>
3232
get() = object : Stream<STATE> {
3333
override fun observe(lambda: (STATE) -> Unit): Closeable {
3434
runOnCreate()
35-
return actual.orbit.observe(lambda)
35+
return actual.stateStream.observe(lambda)
3636
}
3737
}
38-
override val sideEffect: Stream<SIDE_EFFECT>
38+
override val sideEffectStream: Stream<SIDE_EFFECT>
3939
get() = object : Stream<SIDE_EFFECT> {
4040
override fun observe(lambda: (SIDE_EFFECT) -> Unit): Closeable {
4141
runOnCreate()
42-
return actual.sideEffect.observe(lambda)
42+
return actual.sideEffectStream.observe(lambda)
4343
}
4444
}
4545

46-
override fun <EVENT : Any> orbit(
47-
event: EVENT,
48-
init: Builder<STATE, SIDE_EFFECT, EVENT>.() -> Builder<STATE, SIDE_EFFECT, *>
49-
) = runOnCreate().also { actual.orbit(event, init) }
46+
override fun orbit(
47+
init: Builder<STATE, SIDE_EFFECT, Unit>.() -> Builder<STATE, SIDE_EFFECT, *>
48+
) = runOnCreate().also { actual.orbit(init) }
5049

5150
private fun runOnCreate() {
5251
if (created.compareAndSet(false, true)) {

orbit-2-core/src/main/java/com/babylon/orbit2/RealContainer.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,21 @@ open class RealContainer<STATE : Any, SIDE_EFFECT : Any>(
4949
private val stateMutex = Mutex()
5050
private val sideEffectMutex = Mutex()
5151

52-
override val orbit: Stream<STATE> =
52+
override val stateStream: Stream<STATE> =
5353
stateChannel.asFlow().distinctUntilChanged().replay(1) { it }.asStream()
5454

55-
override val sideEffect: Stream<SIDE_EFFECT> =
55+
override val sideEffectStream: Stream<SIDE_EFFECT> =
5656
if (settings.sideEffectCaching) {
5757
sideEffectChannel.asCachingStream(scope)
5858
} else {
5959
sideEffectChannel.asStream(scope)
6060
}
6161

62-
override fun <EVENT : Any> orbit(
63-
event: EVENT,
64-
init: Builder<STATE, SIDE_EFFECT, EVENT>.() -> Builder<STATE, SIDE_EFFECT, *>
62+
override fun orbit(
63+
init: Builder<STATE, SIDE_EFFECT, Unit>.() -> Builder<STATE, SIDE_EFFECT, *>
6564
) {
6665
scope.launch {
67-
collectFlow(
68-
event,
69-
init
70-
)
66+
collectFlow(init)
7167
}
7268
}
7369

@@ -91,18 +87,17 @@ open class RealContainer<STATE : Any, SIDE_EFFECT : Any>(
9187
)
9288

9389
@Suppress("UNCHECKED_CAST")
94-
suspend fun <EVENT : Any> collectFlow(
95-
event: EVENT,
96-
init: Builder<STATE, SIDE_EFFECT, EVENT>.() -> Builder<STATE, SIDE_EFFECT, *>
90+
suspend fun collectFlow(
91+
init: Builder<STATE, SIDE_EFFECT, Unit>.() -> Builder<STATE, SIDE_EFFECT, *>
9792
) {
98-
Builder<STATE, SIDE_EFFECT, EVENT>()
99-
.init().stack.fold(flowOf(event)) { flow: Flow<Any>, operator: Operator<STATE, *> ->
93+
Builder<STATE, SIDE_EFFECT, Unit>()
94+
.init().stack.fold(flowOf(Unit)) { flow: Flow<Any>, operator: Operator<STATE, *> ->
10095
Orbit.plugins.fold(flow) { flow2: Flow<Any>, plugin: OrbitPlugin ->
10196
plugin.apply(
10297
pluginContext,
10398
flow2,
10499
operator as Operator<STATE, Any>
105-
) { RealContext(currentState, it) }
100+
) { Context(currentState, it) }
106101
}
107102
}.collect()
108103
}

orbit-2-core/src/main/java/com/babylon/orbit2/RealContext.kt

Lines changed: 0 additions & 20 deletions
This file was deleted.

orbit-2-core/src/test/java/com/babylon/orbit2/BaseDslBehaviourTest.kt

Lines changed: 34 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,59 +27,51 @@ internal class BaseDslBehaviourTest {
2727
@Test
2828
fun `reducer produces new states`() {
2929
val action = fixture<Int>()
30+
val middleware = BaseDslMiddleware().test(initialState)
3031

31-
BaseDslMiddleware()
32-
.given(initialState)
33-
.whenever {
34-
reducer(action)
35-
}
36-
.then {
37-
states(
38-
{ TestState(action) }
39-
)
40-
}
32+
middleware.reducer(action)
33+
34+
middleware.assert {
35+
states(
36+
{ TestState(action) }
37+
)
38+
}
4139
}
4240

4341
@Test
4442
fun `transformer maps values`() {
4543
val action = fixture<Int>()
44+
val middleware = BaseDslMiddleware().test(initialState)
4645

47-
BaseDslMiddleware()
48-
.given(initialState)
49-
.whenever {
50-
transformer(action)
51-
}
52-
.then {
53-
states(
54-
{ TestState(action + 5) }
55-
)
56-
}
46+
middleware.transformer(action)
47+
48+
middleware.assert {
49+
states(
50+
{ TestState(action + 5) }
51+
)
52+
}
5753
}
5854

5955
@Test
6056
fun `posting side effects emit side effects`() {
6157
val action = fixture<Int>()
58+
val middleware = BaseDslMiddleware().test(initialState)
6259

63-
BaseDslMiddleware()
64-
.given(initialState)
65-
.whenever {
66-
postingSideEffect(action)
67-
}
68-
.then {
69-
postedSideEffects(action.toString())
70-
}
60+
middleware.postingSideEffect(action)
61+
62+
middleware.assert {
63+
postedSideEffects(action.toString())
64+
}
7165
}
7266

7367
@Test
7468
fun `side effect does not post anything if post is not called`() {
7569
val action = fixture<Int>()
70+
val middleware = BaseDslMiddleware().test(initialState)
7671

77-
BaseDslMiddleware()
78-
.given(initialState)
79-
.whenever {
80-
sideEffect(action)
81-
}
82-
.then {}
72+
middleware.sideEffect(action)
73+
74+
middleware.assert {}
8375
}
8476

8577
private data class TestState(val id: Int)
@@ -89,30 +81,30 @@ internal class BaseDslBehaviourTest {
8981
TestState(42)
9082
)
9183

92-
fun reducer(action: Int) = orbit(action) {
84+
fun reducer(action: Int) = orbit {
9385
reduce {
94-
state.copy(id = event)
86+
state.copy(id = action)
9587
}
9688
}
9789

98-
fun transformer(action: Int) = orbit(action) {
90+
fun transformer(action: Int) = orbit {
9991
transform {
100-
event + 5
92+
action + 5
10193
}
10294
.reduce {
10395
state.copy(id = event)
10496
}
10597
}
10698

107-
fun postingSideEffect(action: Int) = orbit(action) {
99+
fun postingSideEffect(action: Int) = orbit {
108100
sideEffect {
109-
post(event.toString())
101+
post(action.toString())
110102
}
111103
}
112104

113-
fun sideEffect(action: Int) = orbit(action) {
105+
fun sideEffect(action: Int) = orbit {
114106
sideEffect {
115-
event.toString()
107+
action.toString()
116108
}
117109
}
118110
}

0 commit comments

Comments
 (0)