Skip to content

Commit adf2dea

Browse files
committed
refactor: replace Reaktive with own stream API
Gives us the flexibility to use sequences, flows or Reaktive depending on the use case. For example, consuming a Reaktive as a flow in JS doesn't work well because of the missing backpressure. If there is no lazy loading then sequences provide a better performance. BREAKING CHANGE: The asynchronous stream based model API switch from Reaktive to a custom one.
1 parent 96173f8 commit adf2dea

File tree

104 files changed

+2194
-1016
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

104 files changed

+2194
-1016
lines changed

model-api/src/commonMain/kotlin/org/modelix/model/api/async/AsyncNode.kt

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,5 @@
11
package org.modelix.model.api.async
22

3-
import com.badoo.reaktive.maybe.Maybe
4-
import com.badoo.reaktive.maybe.map
5-
import com.badoo.reaktive.maybe.mapNotNull
6-
import com.badoo.reaktive.maybe.notNull
7-
import com.badoo.reaktive.observable.Observable
8-
import com.badoo.reaktive.observable.flatMap
9-
import com.badoo.reaktive.observable.map
10-
import com.badoo.reaktive.observable.notNull
11-
import com.badoo.reaktive.observable.observableOf
12-
import com.badoo.reaktive.single.Single
13-
import com.badoo.reaktive.single.map
143
import org.modelix.model.api.ConceptReference
154
import org.modelix.model.api.IChildLinkReference
165
import org.modelix.model.api.IConcept
@@ -21,6 +10,8 @@ import org.modelix.model.api.IPropertyReference
2110
import org.modelix.model.api.IReferenceLinkReference
2211
import org.modelix.model.api.resolve
2312
import org.modelix.model.api.resolveInCurrentContext
13+
import org.modelix.streams.IStream
14+
import org.modelix.streams.flatten
2415

2516
class AsyncNode(
2617
private val regularNode: INode,
@@ -33,63 +24,63 @@ class AsyncNode(
3324

3425
private fun Long.asNode(): IAsyncNode = createNodeAdapter(this)
3526

36-
override fun getParent(): Maybe<IAsyncNode> {
27+
override fun getParent(): IStream.ZeroOrOne<IAsyncNode> {
3728
return tree().getParent(nodeId).map { it.asNode() }
3829
}
3930

40-
override fun getConcept(): Single<IConcept> {
31+
override fun getConcept(): IStream.One<IConcept> {
4132
return tree().getConceptReference(nodeId).map { it.resolve() }
4233
}
4334

44-
override fun getConceptRef(): Single<ConceptReference> {
35+
override fun getConceptRef(): IStream.One<ConceptReference> {
4536
return tree().getConceptReference(nodeId)
4637
}
4738

48-
override fun getRoleInParent(): Single<IChildLinkReference> {
39+
override fun getRoleInParent(): IStream.One<IChildLinkReference> {
4940
return tree().getRole(nodeId)
5041
}
5142

52-
override fun getPropertyValue(role: IPropertyReference): Maybe<String> {
43+
override fun getPropertyValue(role: IPropertyReference): IStream.ZeroOrOne<String> {
5344
return tree().getPropertyValue(nodeId, role)
5445
}
5546

56-
override fun getAllPropertyValues(): Observable<Pair<IPropertyReference, String>> {
47+
override fun getAllPropertyValues(): IStream.Many<Pair<IPropertyReference, String>> {
5748
return tree().getAllPropertyValues(nodeId)
5849
}
5950

60-
override fun getAllChildren(): Observable<IAsyncNode> {
51+
override fun getAllChildren(): IStream.Many<IAsyncNode> {
6152
return tree().getAllChildren(nodeId).map { it.asNode() }
6253
}
6354

64-
override fun getChildren(role: IChildLinkReference): Observable<IAsyncNode> {
55+
override fun getChildren(role: IChildLinkReference): IStream.Many<IAsyncNode> {
6556
return tree().getChildren(nodeId, role).map { it.asNode() }
6657
}
6758

68-
override fun getReferenceTarget(role: IReferenceLinkReference): Maybe<IAsyncNode> {
59+
override fun getReferenceTarget(role: IReferenceLinkReference): IStream.ZeroOrOne<IAsyncNode> {
6960
return getReferenceTargetRef(role).mapNotNull {
7061
INodeResolutionScope.runWithAdditionalScope(regularNode.getArea()) {
7162
it.resolveInCurrentContext()?.asAsyncNode()
7263
}
7364
}
7465
}
7566

76-
override fun getReferenceTargetRef(role: IReferenceLinkReference): Maybe<INodeReference> {
77-
return tree().getReferenceTarget(nodeId, role).notNull()
67+
override fun getReferenceTargetRef(role: IReferenceLinkReference): IStream.ZeroOrOne<INodeReference> {
68+
return tree().getReferenceTarget(nodeId, role)
7869
}
7970

80-
override fun getAllReferenceTargetRefs(): Observable<Pair<IReferenceLinkReference, INodeReference>> {
71+
override fun getAllReferenceTargetRefs(): IStream.Many<Pair<IReferenceLinkReference, INodeReference>> {
8172
return tree().getAllReferenceTargetRefs(nodeId)
8273
}
8374

84-
override fun getAllReferenceTargets(): Observable<Pair<IReferenceLinkReference, IAsyncNode>> {
85-
return tree().getAllReferenceTargetRefs(nodeId).map {
86-
it.first to (it.second.resolveInCurrentContext() ?: return@map null).asAsyncNode()
87-
}.notNull()
75+
override fun getAllReferenceTargets(): IStream.Many<Pair<IReferenceLinkReference, IAsyncNode>> {
76+
return tree().getAllReferenceTargetRefs(nodeId).mapNotNull {
77+
it.first to (it.second.resolveInCurrentContext() ?: return@mapNotNull null).asAsyncNode()
78+
}
8879
}
8980

90-
override fun getDescendants(includeSelf: Boolean): Observable<IAsyncNode> {
81+
override fun getDescendants(includeSelf: Boolean): IStream.Many<IAsyncNode> {
9182
return if (includeSelf) {
92-
observableOf(observableOf(this), getDescendants(false)).flatMap { it }
83+
IStream.of(IStream.of(this), getDescendants(false)).flatten()
9384
} else {
9485
getAllChildren().flatMap { it.getDescendants(true) }
9586
}

model-api/src/commonMain/kotlin/org/modelix/model/api/async/IAsyncNode.kt

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,35 @@
11
package org.modelix.model.api.async
22

3-
import com.badoo.reaktive.maybe.Maybe
4-
import com.badoo.reaktive.observable.Observable
5-
import com.badoo.reaktive.single.Single
63
import org.modelix.model.api.ConceptReference
74
import org.modelix.model.api.IChildLinkReference
85
import org.modelix.model.api.IConcept
96
import org.modelix.model.api.INode
107
import org.modelix.model.api.INodeReference
118
import org.modelix.model.api.IPropertyReference
129
import org.modelix.model.api.IReferenceLinkReference
10+
import org.modelix.streams.IStream
1311

1412
interface IAsyncNode {
1513
fun asRegularNode(): INode
1614

17-
fun getConcept(): Single<IConcept>
18-
fun getConceptRef(): Single<ConceptReference>
15+
fun getConcept(): IStream.One<IConcept>
16+
fun getConceptRef(): IStream.One<ConceptReference>
1917

20-
fun getRoleInParent(): Single<IChildLinkReference>
21-
fun getParent(): Maybe<IAsyncNode>
18+
fun getRoleInParent(): IStream.One<IChildLinkReference>
19+
fun getParent(): IStream.ZeroOrOne<IAsyncNode>
2220

23-
fun getPropertyValue(role: IPropertyReference): Maybe<String>
24-
fun getAllPropertyValues(): Observable<Pair<IPropertyReference, String>>
21+
fun getPropertyValue(role: IPropertyReference): IStream.ZeroOrOne<String>
22+
fun getAllPropertyValues(): IStream.Many<Pair<IPropertyReference, String>>
2523

26-
fun getAllChildren(): Observable<IAsyncNode>
27-
fun getChildren(role: IChildLinkReference): Observable<IAsyncNode>
24+
fun getAllChildren(): IStream.Many<IAsyncNode>
25+
fun getChildren(role: IChildLinkReference): IStream.Many<IAsyncNode>
2826

29-
fun getReferenceTarget(role: IReferenceLinkReference): Maybe<IAsyncNode>
30-
fun getReferenceTargetRef(role: IReferenceLinkReference): Maybe<INodeReference>
31-
fun getAllReferenceTargetRefs(): Observable<Pair<IReferenceLinkReference, INodeReference>>
32-
fun getAllReferenceTargets(): Observable<Pair<IReferenceLinkReference, IAsyncNode>>
27+
fun getReferenceTarget(role: IReferenceLinkReference): IStream.ZeroOrOne<IAsyncNode>
28+
fun getReferenceTargetRef(role: IReferenceLinkReference): IStream.ZeroOrOne<INodeReference>
29+
fun getAllReferenceTargetRefs(): IStream.Many<Pair<IReferenceLinkReference, INodeReference>>
30+
fun getAllReferenceTargets(): IStream.Many<Pair<IReferenceLinkReference, IAsyncNode>>
3331

34-
fun getDescendants(includeSelf: Boolean): Observable<IAsyncNode>
32+
fun getDescendants(includeSelf: Boolean): IStream.Many<IAsyncNode>
3533
}
3634

3735
interface INodeWithAsyncSupport : INode {
Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,68 @@
11
package org.modelix.model.api.async
22

3-
import com.badoo.reaktive.maybe.Maybe
4-
import com.badoo.reaktive.maybe.flatMapObservable
5-
import com.badoo.reaktive.observable.Observable
6-
import com.badoo.reaktive.observable.concatWith
7-
import com.badoo.reaktive.observable.flatMap
8-
import com.badoo.reaktive.observable.observableOf
9-
import com.badoo.reaktive.single.Single
103
import org.modelix.model.api.ConceptReference
114
import org.modelix.model.api.IChildLinkReference
125
import org.modelix.model.api.INodeReference
136
import org.modelix.model.api.IPropertyReference
147
import org.modelix.model.api.IReferenceLinkReference
158
import org.modelix.model.api.ITree
9+
import org.modelix.streams.IStream
10+
import org.modelix.streams.plus
1611

1712
interface IAsyncTree {
1813
fun asSynchronousTree(): ITree
19-
fun getChanges(oldVersion: IAsyncTree, changesOnly: Boolean): Observable<TreeChangeEvent>
14+
fun getChanges(oldVersion: IAsyncTree, changesOnly: Boolean): IStream.Many<TreeChangeEvent>
2015

21-
fun getConceptReference(nodeId: Long): Single<ConceptReference>
16+
fun getConceptReference(nodeId: Long): IStream.One<ConceptReference>
2217

23-
fun containsNode(nodeId: Long): Single<Boolean>
18+
fun containsNode(nodeId: Long): IStream.One<Boolean>
2419

25-
fun getParent(nodeId: Long): Maybe<Long>
26-
fun getRole(nodeId: Long): Single<IChildLinkReference>
20+
fun getParent(nodeId: Long): IStream.ZeroOrOne<Long>
21+
fun getRole(nodeId: Long): IStream.One<IChildLinkReference>
2722

28-
fun getChildren(parentId: Long, role: IChildLinkReference): Observable<Long>
29-
fun getChildRoles(sourceId: Long): Observable<IChildLinkReference>
30-
fun getAllChildren(parentId: Long): Observable<Long>
23+
fun getChildren(parentId: Long, role: IChildLinkReference): IStream.Many<Long>
24+
fun getChildRoles(sourceId: Long): IStream.Many<IChildLinkReference>
25+
fun getAllChildren(parentId: Long): IStream.Many<Long>
3126

32-
fun getPropertyValue(nodeId: Long, role: IPropertyReference): Maybe<String>
27+
fun getPropertyValue(nodeId: Long, role: IPropertyReference): IStream.ZeroOrOne<String>
3328

34-
fun getPropertyRoles(sourceId: Long): Observable<IPropertyReference>
35-
fun getAllPropertyValues(sourceId: Long): Observable<Pair<IPropertyReference, String>>
29+
fun getPropertyRoles(sourceId: Long): IStream.Many<IPropertyReference>
30+
fun getAllPropertyValues(sourceId: Long): IStream.Many<Pair<IPropertyReference, String>>
3631

37-
fun getAllReferenceTargetRefs(sourceId: Long): Observable<Pair<IReferenceLinkReference, INodeReference>>
38-
fun getReferenceTarget(sourceId: Long, role: IReferenceLinkReference): Maybe<INodeReference>
39-
fun getReferenceRoles(sourceId: Long): Observable<IReferenceLinkReference>
32+
fun getAllReferenceTargetRefs(sourceId: Long): IStream.Many<Pair<IReferenceLinkReference, INodeReference>>
33+
fun getReferenceTarget(sourceId: Long, role: IReferenceLinkReference): IStream.ZeroOrOne<INodeReference>
34+
fun getReferenceRoles(sourceId: Long): IStream.Many<IReferenceLinkReference>
4035
}
4136

4237
interface IAsyncMutableTree : IAsyncTree {
43-
fun deleteNodes(nodeIds: LongArray): Single<IAsyncMutableTree>
44-
fun moveChild(newParentId: Long, newRole: IChildLinkReference, newIndex: Int, childId: Long): Single<IAsyncMutableTree>
45-
fun setConcept(nodeId: Long, concept: ConceptReference): Single<IAsyncMutableTree>
38+
fun deleteNodes(nodeIds: LongArray): IStream.One<IAsyncMutableTree>
39+
fun moveChild(newParentId: Long, newRole: IChildLinkReference, newIndex: Int, childId: Long): IStream.One<IAsyncMutableTree>
40+
fun setConcept(nodeId: Long, concept: ConceptReference): IStream.One<IAsyncMutableTree>
4641

47-
fun setPropertyValue(nodeId: Long, role: IPropertyReference, value: String?): Single<IAsyncMutableTree>
42+
fun setPropertyValue(nodeId: Long, role: IPropertyReference, value: String?): IStream.One<IAsyncMutableTree>
4843

49-
fun addNewChildren(parentId: Long, role: IChildLinkReference, index: Int, newIds: LongArray, concepts: Array<ConceptReference>): Single<IAsyncMutableTree>
44+
fun addNewChildren(parentId: Long, role: IChildLinkReference, index: Int, newIds: LongArray, concepts: Array<ConceptReference>): IStream.One<IAsyncMutableTree>
5045

51-
fun setReferenceTarget(sourceId: Long, role: IReferenceLinkReference, target: INodeReference?): Single<IAsyncMutableTree>
52-
fun setReferenceTarget(sourceId: Long, role: IReferenceLinkReference, targetId: Long): Single<IAsyncMutableTree>
46+
fun setReferenceTarget(sourceId: Long, role: IReferenceLinkReference, target: INodeReference?): IStream.One<IAsyncMutableTree>
47+
fun setReferenceTarget(sourceId: Long, role: IReferenceLinkReference, targetId: Long): IStream.One<IAsyncMutableTree>
5348
}
5449

55-
fun IAsyncTree.getAncestors(nodeId: Long, includeSelf: Boolean): Observable<Long> {
50+
fun IAsyncTree.getAncestors(nodeId: Long, includeSelf: Boolean): IStream.Many<Long> {
5651
return if (includeSelf) {
57-
observableOf(nodeId).concatWith(getAncestors(nodeId, false))
52+
IStream.of(nodeId) + getAncestors(nodeId, false)
5853
} else {
59-
getParent(nodeId).flatMapObservable { getAncestors(it, true) }
54+
getParent(nodeId).flatMap { getAncestors(it, true) }
6055
}
6156
}
6257

63-
fun IAsyncTree.getDescendants(nodeId: Long, includeSelf: Boolean): Observable<Long> {
58+
fun IAsyncTree.getDescendants(nodeId: Long, includeSelf: Boolean): IStream.Many<Long> {
6459
return if (includeSelf) getDescendantsAndSelf(nodeId) else getDescendants(nodeId)
6560
}
6661

67-
fun IAsyncTree.getDescendants(nodeId: Long): Observable<Long> {
62+
fun IAsyncTree.getDescendants(nodeId: Long): IStream.Many<Long> {
6863
return getAllChildren(nodeId).flatMap { getDescendantsAndSelf(it) }
6964
}
7065

71-
fun IAsyncTree.getDescendantsAndSelf(nodeId: Long): Observable<Long> {
72-
return observableOf(nodeId).concatWith(getDescendants(nodeId))
66+
fun IAsyncTree.getDescendantsAndSelf(nodeId: Long): IStream.Many<Long> {
67+
return IStream.of(nodeId) + getDescendants(nodeId)
7368
}

model-api/src/commonMain/kotlin/org/modelix/model/api/async/NodeAsAsyncNode.kt

Lines changed: 27 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,8 @@ package org.modelix.model.api.async
33
import com.badoo.reaktive.maybe.Maybe
44
import com.badoo.reaktive.maybe.maybeOf
55
import com.badoo.reaktive.maybe.maybeOfEmpty
6-
import com.badoo.reaktive.observable.Observable
7-
import com.badoo.reaktive.observable.asObservable
86
import com.badoo.reaktive.single.Single
97
import com.badoo.reaktive.single.singleOf
10-
import com.badoo.reaktive.single.toSingle
118
import org.modelix.model.api.ConceptReference
129
import org.modelix.model.api.IChildLinkReference
1310
import org.modelix.model.api.IConcept
@@ -19,6 +16,7 @@ import org.modelix.model.api.asProperty
1916
import org.modelix.model.api.getDescendants
2017
import org.modelix.model.api.meta.NullConcept
2118
import org.modelix.model.api.toReference
19+
import org.modelix.streams.IStream
2220

2321
class NodeAsAsyncNode(val node: INode) : IAsyncNode {
2422

@@ -27,55 +25,55 @@ class NodeAsAsyncNode(val node: INode) : IAsyncNode {
2725

2826
override fun asRegularNode(): INode = node
2927

30-
override fun getConcept(): Single<IConcept> {
31-
return (node.concept ?: NullConcept).asMono()
28+
override fun getConcept(): IStream.One<IConcept> {
29+
return IStream.of((node.concept ?: NullConcept))
3230
}
3331

34-
override fun getConceptRef(): Single<ConceptReference> {
35-
return ((node.getConceptReference() ?: NullConcept.getReference()) as ConceptReference).asMono()
32+
override fun getConceptRef(): IStream.One<ConceptReference> {
33+
return IStream.of(((node.getConceptReference() ?: NullConcept.getReference()) as ConceptReference))
3634
}
3735

38-
override fun getParent(): Maybe<IAsyncNode> {
39-
return node.parent?.asAsyncNode().asOptionalMono()
36+
override fun getParent(): IStream.ZeroOrOne<IAsyncNode> {
37+
return IStream.ofNotNull(node.parent?.asAsyncNode())
4038
}
4139

42-
override fun getRoleInParent(): Single<IChildLinkReference> {
43-
return node.getContainmentLink().toReference().toSingle()
40+
override fun getRoleInParent(): IStream.One<IChildLinkReference> {
41+
return IStream.of(node.getContainmentLink().toReference())
4442
}
4543

46-
override fun getPropertyValue(role: IPropertyReference): Maybe<String> {
47-
return node.getPropertyValue(role.asProperty()).asOptionalMono()
44+
override fun getPropertyValue(role: IPropertyReference): IStream.ZeroOrOne<String> {
45+
return IStream.ofNotNull(node.getPropertyValue(role.asProperty()))
4846
}
4947

50-
override fun getAllChildren(): Observable<IAsyncNode> {
51-
return node.allChildren.map { it.asAsyncNode() }.asObservable()
48+
override fun getAllChildren(): IStream.Many<IAsyncNode> {
49+
return IStream.many(node.allChildren.map { it.asAsyncNode() })
5250
}
5351

54-
override fun getChildren(role: IChildLinkReference): Observable<IAsyncNode> {
55-
return node.getChildren(role.toLegacy()).map { it.asAsyncNode() }.asObservable()
52+
override fun getChildren(role: IChildLinkReference): IStream.Many<IAsyncNode> {
53+
return IStream.many(node.getChildren(role.toLegacy()).map { it.asAsyncNode() })
5654
}
5755

58-
override fun getReferenceTarget(role: IReferenceLinkReference): Maybe<IAsyncNode> {
59-
return node.getReferenceTarget(role.toLegacy())?.asAsyncNode().asOptionalMono()
56+
override fun getReferenceTarget(role: IReferenceLinkReference): IStream.ZeroOrOne<IAsyncNode> {
57+
return IStream.ofNotNull(node.getReferenceTarget(role.toLegacy())?.asAsyncNode())
6058
}
6159

62-
override fun getReferenceTargetRef(role: IReferenceLinkReference): Maybe<INodeReference> {
63-
return node.getReferenceTargetRef(role.toLegacy()).asOptionalMono()
60+
override fun getReferenceTargetRef(role: IReferenceLinkReference): IStream.ZeroOrOne<INodeReference> {
61+
return IStream.ofNotNull(node.getReferenceTargetRef(role.toLegacy()))
6462
}
6563

66-
override fun getAllReferenceTargetRefs(): Observable<Pair<IReferenceLinkReference, INodeReference>> {
67-
return node.getAllReferenceTargetRefs().map { it.first.toReference() to it.second }.asObservable()
64+
override fun getAllReferenceTargetRefs(): IStream.Many<Pair<IReferenceLinkReference, INodeReference>> {
65+
return IStream.many(node.getAllReferenceTargetRefs().map { it.first.toReference() to it.second })
6866
}
6967

70-
override fun getAllPropertyValues(): Observable<Pair<IPropertyReference, String>> {
71-
return node.getAllProperties().map { it.first.toReference() to it.second }.asObservable()
68+
override fun getAllPropertyValues(): IStream.Many<Pair<IPropertyReference, String>> {
69+
return IStream.many(node.getAllProperties().map { it.first.toReference() to it.second })
7270
}
7371

74-
override fun getAllReferenceTargets(): Observable<Pair<IReferenceLinkReference, IAsyncNode>> {
75-
return node.getAllReferenceTargets().map { it.first.toReference() to it.second.asAsyncNode() }.asObservable()
72+
override fun getAllReferenceTargets(): IStream.Many<Pair<IReferenceLinkReference, IAsyncNode>> {
73+
return IStream.many(node.getAllReferenceTargets().map { it.first.toReference() to it.second.asAsyncNode() })
7674
}
7775

78-
override fun getDescendants(includeSelf: Boolean): Observable<IAsyncNode> {
79-
return node.getDescendants(includeSelf).map { it.asAsyncNode() }.asIterable().asObservable()
76+
override fun getDescendants(includeSelf: Boolean): IStream.Many<IAsyncNode> {
77+
return IStream.many(node.getDescendants(includeSelf).map { it.asAsyncNode() })
8078
}
8179
}

0 commit comments

Comments
 (0)