|
|
|
@ -352,6 +352,28 @@ rec { |
|
|
|
|
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. |
|
|
|
|