import { type Type } from '../type.mjs';
import { createAssertFn } from './create-assert-fn.mjs';
import { createCastFn } from './create-cast-fn.mjs';
import { createIsFn } from './create-is-fn.mjs';
export const createType = ({
defaultValue,
fill,
prune,
typeName,
validate,
}: Readonly<{
typeName: string;
defaultValue: A;
validate: Type['validate'];
fill?: Type['fill'];
prune?: Type['prune'];
}>): Type => {
const is = createIsFn(validate);
return {
typeName,
defaultValue,
validate,
is,
assertIs: createAssertFn(validate),
fill: fill ?? ((a) => (is(a) ? a : defaultValue)),
prune: prune ?? ((a) => a),
cast: createCastFn(validate),
};
};