|
13 | 13 | */
|
14 | 14 | package org.modelix.modelql.core
|
15 | 15 |
|
| 16 | +import kotlinx.coroutines.flow.map |
16 | 17 | import kotlinx.coroutines.flow.onEmpty
|
17 | 18 | import kotlinx.serialization.KSerializer
|
18 | 19 | import kotlinx.serialization.SerialName
|
19 | 20 | import kotlinx.serialization.Serializable
|
20 |
| -import kotlinx.serialization.builtins.nullable |
21 | 21 | import kotlinx.serialization.modules.SerializersModule
|
22 | 22 |
|
23 | 23 | class NullIfEmpty<E>() : MonoTransformingStep<E, E?>() {
|
24 | 24 |
|
25 | 25 | override fun getOutputSerializer(serializersModule: SerializersModule): KSerializer<out IStepOutput<E?>> {
|
26 |
| - val serializer: KSerializer<IStepOutput<E>> = getProducer().getOutputSerializer(serializersModule).upcast() |
27 |
| - val valueSerializer = (serializer as SimpleStepOutputSerializer<E>).valueSerializer |
28 |
| - val nullableValueSerializer = (valueSerializer as KSerializer<Any>).nullable as KSerializer<E?> |
29 |
| - return nullableValueSerializer.stepOutputSerializer(this) |
| 26 | + return MultiplexedOutputSerializer( |
| 27 | + this, |
| 28 | + listOf( |
| 29 | + getProducer().getOutputSerializer(serializersModule).upcast(), |
| 30 | + nullSerializer<E?>().stepOutputSerializer(this).upcast(), |
| 31 | + ), |
| 32 | + ) |
30 | 33 | }
|
31 | 34 |
|
32 | 35 | override fun createFlow(input: StepFlow<E>, context: IFlowInstantiationContext): StepFlow<E?> {
|
33 | 36 | val downcast: StepFlow<E?> = input
|
34 |
| - return downcast.onEmpty { emit((null as E?).asStepOutput(this@NullIfEmpty)) } |
| 37 | + return downcast.map { MultiplexedOutput(0, it) }.onEmpty { |
| 38 | + emit(MultiplexedOutput(1, null.asStepOutput(this@NullIfEmpty))) |
| 39 | + } |
35 | 40 | }
|
36 | 41 |
|
37 | 42 | override fun transform(evaluationContext: QueryEvaluationContext, input: E): E? {
|
|
0 commit comments