mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-09 19:13:26 +03:00
lib.types.defaultTypeMerge: refactor functor.{payload,wrapped} merging
This commit is contained in:
parent
d2dfc1ac21
commit
b978799f71
3 changed files with 60 additions and 14 deletions
|
@ -83,23 +83,37 @@ rec {
|
|||
# Default type merging function
|
||||
# takes two type functors and return the merged type
|
||||
defaultTypeMerge = f: f':
|
||||
let wrapped = f.wrapped.typeMerge f'.wrapped.functor;
|
||||
payload = f.binOp f.payload f'.payload;
|
||||
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;
|
||||
in
|
||||
# cannot merge different types
|
||||
# Abort early: cannot merge different types
|
||||
if f.name != f'.name
|
||||
then null
|
||||
# simple types
|
||||
else if (f.wrapped == null && f'.wrapped == null)
|
||||
&& (f.payload == null && f'.payload == null)
|
||||
then f.type
|
||||
# composed types
|
||||
else if (f.wrapped != null && f'.wrapped != null) && (wrapped != null)
|
||||
then f.type wrapped
|
||||
# value types
|
||||
else if (f.payload != null && f'.payload != null) && (payload != null)
|
||||
then f.type payload
|
||||
else null;
|
||||
else
|
||||
|
||||
if hasPayload then
|
||||
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 `functor.payload` from the type definition.
|
||||
''
|
||||
else
|
||||
# Has payload
|
||||
if mergedPayload == null then null else f.type mergedPayload
|
||||
else
|
||||
if hasWrapped then
|
||||
# Has wrapped
|
||||
# TODO(@hsjobeki): This could also be a warning and removed in the future
|
||||
if mergedWrapped == null then null else f.type mergedWrapped
|
||||
else
|
||||
f.type;
|
||||
|
||||
# Default type functor
|
||||
defaultFunctor = name: {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue