types library: add coercedTo

Changed files
+22
lib
+22
lib/types.nix
···
functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; };
};
# Obsolete alternative to configOf. It takes its option
# declarations from the ‘options’ attribute of containing option
# declaration.
···
functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; };
};
+
coercedTo = coercedType: coerceFunc: finalType:
+
assert coercedType.getSubModules == null;
+
mkOptionType rec {
+
name = "coercedTo";
+
description = "${finalType.description} or ${coercedType.description}";
+
check = x: finalType.check x || coercedType.check x;
+
merge = loc: defs:
+
let
+
coerceVal = val:
+
if finalType.check val then val
+
else let
+
coerced = coerceFunc val;
+
in assert finalType.check coerced; coerced;
+
+
in finalType.merge loc (map (def: def // { value = coerceVal def.value; }) defs);
+
getSubOptions = finalType.getSubOptions;
+
getSubModules = finalType.getSubModules;
+
substSubModules = m: coercedTo coercedType coerceFunc (finalType.substSubModules m);
+
typeMerge = t1: t2: null;
+
functor = (defaultFunctor name) // { wrapped = finalType; };
+
};
+
# Obsolete alternative to configOf. It takes its option
# declarations from the ‘options’ attribute of containing option
# declaration.