combine<DATA_2 extends Object, DATA_3 extends Object> method

LceState<DATA_3> combine<DATA_2 extends Object, DATA_3 extends Object>(
  1. LceState<DATA_2> other,
  2. DATA_3? mapper(
    1. DATA_1? data1,
    2. 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 with
  • mapper 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()
  );
}