{"version":3,"file":"uint-range-inclusive.mjs","sources":["../../src/enum/uint-range-inclusive.mts"],"sourcesContent":["import { isNumber, memoizeFunction, Num, Result } from 'ts-data-forge';\nimport { type Uint11, type UintRangeInclusive } from 'ts-type-forge';\nimport { type Type } from '../type.mjs';\nimport {\n  createAssertFn,\n  createCastFn,\n  createIsFn,\n  type ValidationError,\n} from '../utils/index.mjs';\n\nexport type { UintRangeInclusive } from 'ts-type-forge';\n\nexport const uintRangeInclusive = <Start extends Uint11, End extends Uint11>(\n  ...args:\n    | readonly [\n        start: Start,\n        end: End,\n        options?: Readonly<{\n          typeName?: string;\n          defaultValue?: UintRangeInclusive<Start, End>;\n        }>,\n      ]\n    | readonly [\n        options: Readonly<{\n          start: Start;\n          end: End;\n          typeName?: string;\n          defaultValue?: UintRangeInclusive<Start, End>;\n        }>,\n      ]\n): Type<UintRangeInclusive<Start, End>> => {\n  switch (args.length) {\n    case 1:\n      return uintRangeInclusiveImpl(args[0].start, args[0].end, {\n        defaultValue: args[0].defaultValue,\n        typeName: args[0].typeName,\n      });\n\n    case 2:\n      return uintRangeInclusiveImpl(args[0], args[1]);\n\n    case 3:\n      return uintRangeInclusiveImpl(args[0], args[1], args[2]);\n  }\n};\n\nconst uintRangeInclusiveImpl = <Start extends Uint11, End extends Uint11>(\n  start: Start,\n  end: End,\n  options?: Readonly<{\n    typeName?: string;\n    defaultValue?: UintRangeInclusive<Start, End>;\n  }>,\n): Type<UintRangeInclusive<Start, End>> => {\n  type T = UintRangeInclusive<Start, End>;\n\n  const typeNameFilled =\n    options?.typeName ?? `uintRangeInclusive(${start}, ${end})`;\n\n  const getDefaultValue = memoizeFunction(\n    // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n    (): T => options?.defaultValue ?? (start as T),\n  );\n\n  const validate: Type<T>['validate'] = (a) => {\n    if (!(\n      isNumber(a) &&\n      Number.isSafeInteger(a) &&\n      Num.isInRangeInclusive(start, end)(a)\n    )) {\n      return Result.err([\n        {\n          path: [],\n          actualValue: a,\n          expectedType: typeNameFilled,\n          typeName: typeNameFilled,\n          details: {\n            kind: 'integer-range-inclusive',\n            start,\n            endInclusive: end,\n          },\n        } satisfies ValidationError,\n      ]);\n    }\n\n    // eslint-disable-next-line total-functions/no-unsafe-type-assertion\n    return Result.ok(a as T);\n  };\n\n  const is = createIsFn<T>(validate);\n\n  const fill: Type<T>['fill'] = (a) => (is(a) ? a : getDefaultValue());\n\n  return {\n    typeName: typeNameFilled,\n    get defaultValue() {\n      return getDefaultValue();\n    },\n    fill,\n    prune: (a) => a,\n    validate,\n    is,\n    assertIs: createAssertFn(validate),\n    cast: createCastFn(validate),\n  };\n};\n"],"names":[],"mappings":";;;;;;AAYO,MAAM,kBAAA,GAAqB,IAC7B,IAAA,KAiBsC;AACzC,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,CAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,KAAK,CAAC,CAAA,CAAE,OAAO,IAAA,CAAK,CAAC,EAAE,GAAA,EAAK;AAAA,QACxD,YAAA,EAAc,IAAA,CAAK,CAAC,CAAA,CAAE,YAAA;AAAA,QACtB,QAAA,EAAU,IAAA,CAAK,CAAC,CAAA,CAAE;AAAA,OACnB,CAAA;AAAA,IAEH,KAAK,CAAA;AACH,MAAA,OAAO,uBAAuB,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,IAEhD,KAAK,CAAA;AACH,MAAA,OAAO,sBAAA,CAAuB,KAAK,CAAC,CAAA,EAAG,KAAK,CAAC,CAAA,EAAG,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA;AAE7D;AAEA,MAAM,sBAAA,GAAyB,CAC7B,KAAA,EACA,GAAA,EACA,OAAA,KAIyC;AAGzC,EAAA,MAAM,iBACJ,OAAA,EAAS,QAAA,IAAY,CAAA,mBAAA,EAAsB,KAAK,KAAK,GAAG,CAAA,CAAA,CAAA;AAE1D,EAAA,MAAM,eAAA,GAAkB,eAAA;AAAA;AAAA,IAEtB,MAAS,SAAS,YAAA,IAAiB;AAAA,GACrC;AAEA,EAAA,MAAM,QAAA,GAAgC,CAAC,CAAA,KAAM;AAC3C,IAAA,IAAI,EACF,QAAA,CAAS,CAAC,CAAA,IACV,OAAO,aAAA,CAAc,CAAC,CAAA,IACtB,GAAA,CAAI,kBAAA,CAAmB,KAAA,EAAO,GAAG,CAAA,CAAE,CAAC,CAAA,CAAA,EACnC;AACD,MAAA,OAAO,OAAO,GAAA,CAAI;AAAA,QAChB;AAAA,UACE,MAAM,EAAC;AAAA,UACP,WAAA,EAAa,CAAA;AAAA,UACb,YAAA,EAAc,cAAA;AAAA,UACd,QAAA,EAAU,cAAA;AAAA,UACV,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,yBAAA;AAAA,YACN,KAAA;AAAA,YACA,YAAA,EAAc;AAAA;AAChB;AACF,OACD,CAAA;AAAA,IACH;AAGA,IAAA,OAAO,MAAA,CAAO,GAAG,CAAM,CAAA;AAAA,EACzB,CAAA;AAEA,EAAA,MAAM,EAAA,GAAK,WAAc,QAAQ,CAAA;AAEjC,EAAA,MAAM,OAAwB,CAAC,CAAA,KAAO,GAAG,CAAC,CAAA,GAAI,IAAI,eAAA,EAAgB;AAElE,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,cAAA;AAAA,IACV,IAAI,YAAA,GAAe;AACjB,MAAA,OAAO,eAAA,EAAgB;AAAA,IACzB,CAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA;AAAA,IACd,QAAA;AAAA,IACA,EAAA;AAAA,IACA,QAAA,EAAU,eAAe,QAAQ,CAAA;AAAA,IACjC,IAAA,EAAM,aAAa,QAAQ;AAAA,GAC7B;AACF,CAAA;;;;"}