query
On this page

defaultTypeMerge

lib.types.defaultTypeMerge

Docs pulled from | This Revision | 10 minutes ago


takes two type functors and return the merged type


Noogle detected

Aliases

Implementation

The following is the current implementation of this function.

defaultTypeMerge =
      f: f':
      let
        mergedWrapped = f.wrapped.typeMerge f'.wrapped.functor;
        mergedPayload = f.binOp f.payload f'.payload;

        hasPayload =
          assert (f'.payload != null) == (f.payload != null);
          f.payload != null;
        hasWrapped =
          assert (f'.wrapped != null) == (f.wrapped != null);
          f.wrapped != null;

        typeFromPayload = if mergedPayload == null then null else f.type mergedPayload;
        typeFromWrapped = if mergedWrapped == null then null else f.type mergedWrapped;
      in
      # Abort early: cannot merge different types
      if f.name != f'.name then
        null
      else

      if hasPayload then
        # Just return the payload if returning wrapped is deprecated
        if f ? wrappedDeprecationMessage then
          typeFromPayload
        else if hasWrapped then
          # Has both wrapped and payload
          throw ''
            Type ${f.name} defines both `functor.payload` and `functor.wrapped` at the same time, which is not supported.

            Use either `functor.payload` or `functor.wrapped` but not both.

            If your code worked before remove either `functor.wrapped` or `functor.payload` from the type definition.
          ''
        else
          typeFromPayload
      else if hasWrapped then
        typeFromWrapped
      else
        f.type;