query
On this page

defaultTypeMerge

lib.types.defaultTypeMerge

Docs pulled from | This Revision | about 1 hour 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;