either
lib.types.either
Docs pulled from | This Revision | 10 minutes ago
Either value of type t1
or t2
.
Noogle detected
Implementation
The following is the current implementation of this function.
either =
t1: t2:
mkOptionType rec {
name = "either";
description =
if t1.descriptionClass or null == "nonRestrictiveClause" then
# Plain, but add comma
"${t1.description}, or ${
optionDescriptionPhrase (class: class == "noun" || class == "conjunction") t2
}"
else
"${optionDescriptionPhrase (class: class == "noun" || class == "conjunction") t1} or ${
optionDescriptionPhrase (
class: class == "noun" || class == "conjunction" || class == "composite"
) t2
}";
descriptionClass = "conjunction";
check = x: t1.check x || t2.check x;
merge =
loc: defs:
let
defList = map (d: d.value) defs;
in
if all (x: t1.check x) defList then
t1.merge loc defs
else if all (x: t2.check x) defList then
t2.merge loc defs
else
mergeOneOption loc defs;
typeMerge =
f':
let
mt1 = t1.typeMerge (elemAt f'.payload.elemType 0).functor;
mt2 = t2.typeMerge (elemAt f'.payload.elemType 1).functor;
in
if (name == f'.name) && (mt1 != null) && (mt2 != null) then functor.type mt1 mt2 else null;
functor = elemTypeFunctor name {
elemType = [
t1
t2
];
};
nestedTypes.left = t1;
nestedTypes.right = t2;
};