query
On this page

defaultTypeMerge

lib.defaultTypeMerge

Docs pulled from | This Revision | 14 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;