combine<DATA_2 extends Object, DATA_3 extends Object> method
LceState<DATA_3>
combine<DATA_2 extends Object, DATA_3 extends Object>(
- LceState<
DATA_2> other, - DATA_3? mapper(
- DATA_1? data1,
- DATA_2? data2
Combines two Lce states. Here is the result state matrix
Receiver | other | Result |
---|---|---|
Loading | Loading | Loading |
Loading | Content | Loading |
Loading | Error | Error |
Loading | Terminated | Terminated |
Content | Loading | Loading |
Content | Content | Content* |
Content | Error | Error |
Content | Terminated | Terminated |
Error | Loading | Error |
Error | Content | Error |
Error | Error | Error |
Error | Terminated | Terminated |
Terminated | Loading | Terminated |
Terminated | Content | Terminated |
Terminated | Error | Terminated |
Terminated | Terminated | Terminated |
- Receiver - An Lce state that has a priority in final state resolution
other
Other state to combine withmapper
Data mapper function. Returning null from it means data is not ready and will result in loading state even if both states has data. You may return null-value of any kind to alter resulting state.
Implementation
LceState<DATA_3> combine<DATA_2 extends Object, DATA_3 extends Object>(
LceState<DATA_2> other,
DATA_3? Function(DATA_1? data1, DATA_2? data2) mapper
) {
final data3 = mapper(data, other.data);
final isValid = null != data3 && dataIsValid && other.dataIsValid;
return when(
loading: (state) => other.whenElse(
error: (state2) => LceState.error(data3, isValid, state2.error),
terminated: () => LceState.terminated(),
onElse: (state2) => LceState.loading(data3, isValid, state.type)
),
content: (state) => other.when(
error: (state2) => LceState.error(data3, isValid, state2.error),
terminated: () => LceState.terminated(),
loading: (state2) => LceState.loading(data3, isValid, state2.type),
content: (state2) => null == data3
? const LceState.loading(null, false)
: LceState.content(data3, isValid)
),
error: (state) => other.whenElse(
terminated: () => LceState.terminated(),
onElse: (state2) => LceState.error(data3, isValid, state.error)
),
terminated: () => LceState.terminated()
);
}