@duplojs/agents-kit 0.0.0-stage → 0.1.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -2
- package/dist/bin/index.d.ts +2 -0
- package/dist/bin/index.mjs +7 -0
- package/dist/bin/install/index.d.ts +2 -0
- package/dist/bin/install/index.mjs +25 -0
- package/dist/bin/install/skill.d.ts +28 -0
- package/dist/bin/install/skill.mjs +58 -0
- package/dist/bin/packagePath.d.ts +2 -0
- package/dist/bin/packagePath.mjs +12 -0
- package/dist/bin/setup/index.d.ts +12 -0
- package/dist/bin/setup/index.mjs +33 -0
- package/dist/bin/setup/instructions.d.ts +8 -0
- package/dist/bin/setup/instructions.mjs +27 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +0 -0
- package/docs/API/10-lang/10-array/10-at.ts +65 -0
- package/docs/API/10-lang/10-array/10-chunk.ts +42 -0
- package/docs/API/10-lang/10-array/10-coalescing.ts +19 -0
- package/docs/API/10-lang/10-array/10-concat.ts +34 -0
- package/docs/API/10-lang/10-array/10-copyWithin.ts +34 -0
- package/docs/API/10-lang/10-array/10-every.ts +25 -0
- package/docs/API/10-lang/10-array/10-fill.ts +34 -0
- package/docs/API/10-lang/10-array/10-fillAll.ts +34 -0
- package/docs/API/10-lang/10-array/10-filter.ts +43 -0
- package/docs/API/10-lang/10-array/10-find.ts +33 -0
- package/docs/API/10-lang/10-array/10-findAndReplace.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceDelete.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceInsert.ts +35 -0
- package/docs/API/10-lang/10-array/10-findAndSpliceReplace.ts +24 -0
- package/docs/API/10-lang/10-array/10-findDuplicates.ts +19 -0
- package/docs/API/10-lang/10-array/10-findIndex.ts +25 -0
- package/docs/API/10-lang/10-array/10-findLast.ts +33 -0
- package/docs/API/10-lang/10-array/10-findLastIndex.ts +25 -0
- package/docs/API/10-lang/10-array/10-first.ts +21 -0
- package/docs/API/10-lang/10-array/10-flat.ts +22 -0
- package/docs/API/10-lang/10-array/10-flatMap.ts +24 -0
- package/docs/API/10-lang/10-array/10-from.ts +25 -0
- package/docs/API/10-lang/10-array/10-group.ts +27 -0
- package/docs/API/10-lang/10-array/10-groupOutput.ts +30 -0
- package/docs/API/10-lang/10-array/10-includes.ts +24 -0
- package/docs/API/10-lang/10-array/10-indexOf.ts +24 -0
- package/docs/API/10-lang/10-array/10-insert.ts +34 -0
- package/docs/API/10-lang/10-array/10-is.ts +15 -0
- package/docs/API/10-lang/10-array/10-isLastIndex.ts +24 -0
- package/docs/API/10-lang/10-array/10-last.ts +21 -0
- package/docs/API/10-lang/10-array/10-lastIndexOf.ts +24 -0
- package/docs/API/10-lang/10-array/10-length.ts +28 -0
- package/docs/API/10-lang/10-array/10-lengthEqual.ts +39 -0
- package/docs/API/10-lang/10-array/10-map.ts +34 -0
- package/docs/API/10-lang/10-array/10-maxElements.ts +44 -0
- package/docs/API/10-lang/10-array/10-minElements.ts +44 -0
- package/docs/API/10-lang/10-array/10-notIncludes.ts +24 -0
- package/docs/API/10-lang/10-array/10-pop.ts +23 -0
- package/docs/API/10-lang/10-array/10-prepend.ts +34 -0
- package/docs/API/10-lang/10-array/10-push.ts +34 -0
- package/docs/API/10-lang/10-array/10-reduce.ts +28 -0
- package/docs/API/10-lang/10-array/10-reduceFrom.ts +16 -0
- package/docs/API/10-lang/10-array/10-reduceRight.ts +28 -0
- package/docs/API/10-lang/10-array/10-reverse.ts +25 -0
- package/docs/API/10-lang/10-array/10-select.ts +26 -0
- package/docs/API/10-lang/10-array/10-set.ts +24 -0
- package/docs/API/10-lang/10-array/10-shift.ts +23 -0
- package/docs/API/10-lang/10-array/10-slice.ts +24 -0
- package/docs/API/10-lang/10-array/10-some.ts +25 -0
- package/docs/API/10-lang/10-array/10-sort.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceDelete.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceInsert.ts +34 -0
- package/docs/API/10-lang/10-array/10-spliceReplace.ts +24 -0
- package/docs/API/10-lang/10-array/10-unshift.ts +34 -0
- package/docs/API/10-lang/10-array/index.llms.md +220 -0
- package/docs/API/10-lang/10-array/index.md +3 -0
- package/docs/API/10-lang/10-chrono/10-addDays.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addHours.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMilliseconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMinutes.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addMonths.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addSeconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addTime.ts +38 -0
- package/docs/API/10-lang/10-chrono/10-addWeeks.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-addYears.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-applyTimezone.ts +29 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanDate.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualDate.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualTime.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-betweenThanTime.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-closestTo.ts +48 -0
- package/docs/API/10-lang/10-chrono/10-computeTime.ts +35 -0
- package/docs/API/10-lang/10-chrono/10-createDate.ts +122 -0
- package/docs/API/10-lang/10-chrono/10-createDateOrThrow.ts +39 -0
- package/docs/API/10-lang/10-chrono/10-createTime.ts +86 -0
- package/docs/API/10-lang/10-chrono/10-createTimeOrThrow.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-eachDate.ts +67 -0
- package/docs/API/10-lang/10-chrono/10-equalDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-equalTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-formatDate.ts +43 -0
- package/docs/API/10-lang/10-chrono/10-formatTime.ts +37 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfMonth.ts +37 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfWeek.ts +30 -0
- package/docs/API/10-lang/10-chrono/10-getDayOfYear.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getDifference.ts +29 -0
- package/docs/API/10-lang/10-chrono/10-getFirstDayOfMonth.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getFirstDayOfWeek.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getHour.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getLastDayOfMonth.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getLastDayOfWeek.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getMilliseconds.ts +24 -0
- package/docs/API/10-lang/10-chrono/10-getMinute.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getMonth.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getSecond.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getTimezoneOffset.ts +28 -0
- package/docs/API/10-lang/10-chrono/10-getWeekOfYear.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-getYear.ts +27 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-greaterThanTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-isSafeTimeValue.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-isSafeTimestamp.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-isTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-lessThanDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanOrEqualDate.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanOrEqualTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-lessThanTime.ts +26 -0
- package/docs/API/10-lang/10-chrono/10-makeSafeTimeValue.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-makeSafeTimestamp.ts +19 -0
- package/docs/API/10-lang/10-chrono/10-maxDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-maxTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-minDate.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-minTime.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-now.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-round.ts +41 -0
- package/docs/API/10-lang/10-chrono/10-serialize.ts +23 -0
- package/docs/API/10-lang/10-chrono/10-sortDates.ts +32 -0
- package/docs/API/10-lang/10-chrono/10-sortTimes.ts +31 -0
- package/docs/API/10-lang/10-chrono/10-subtractDays.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractHours.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMilliseconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMinutes.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractMonths.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractSeconds.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractTime.ts +38 -0
- package/docs/API/10-lang/10-chrono/10-subtractWeeks.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-subtractYears.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-toDateISOString.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-toNative.ts +25 -0
- package/docs/API/10-lang/10-chrono/10-toTimeValue.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-toTimestamp.ts +17 -0
- package/docs/API/10-lang/10-chrono/10-today.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-tomorrow.ts +13 -0
- package/docs/API/10-lang/10-chrono/10-yesterday.ts +13 -0
- package/docs/API/10-lang/10-chrono/index.llms.md +332 -0
- package/docs/API/10-lang/10-chrono/index.md +3 -0
- package/docs/API/10-lang/10-common/10-and.ts +45 -0
- package/docs/API/10-lang/10-common/10-asserts.ts +13 -0
- package/docs/API/10-lang/10-common/10-asyncInnerPipe.ts +23 -0
- package/docs/API/10-lang/10-common/10-asyncLoop.ts +25 -0
- package/docs/API/10-lang/10-common/10-asyncPipe.ts +21 -0
- package/docs/API/10-lang/10-common/10-callThen.ts +22 -0
- package/docs/API/10-lang/10-common/10-cast.ts +16 -0
- package/docs/API/10-lang/10-common/10-clone.ts +12 -0
- package/docs/API/10-lang/10-common/10-createAsyncRetry.ts +34 -0
- package/docs/API/10-lang/10-common/10-createBuilder.ts +19 -0
- package/docs/API/10-lang/10-common/10-createEnum.ts +25 -0
- package/docs/API/10-lang/10-common/10-createExternalPromise.ts +13 -0
- package/docs/API/10-lang/10-common/10-createFormData.ts +16 -0
- package/docs/API/10-lang/10-common/10-createInterpolation.ts +12 -0
- package/docs/API/10-lang/10-common/10-createQueue.ts +16 -0
- package/docs/API/10-lang/10-common/10-createTransformer.ts +16 -0
- package/docs/API/10-lang/10-common/10-detachObjectMethod.ts +20 -0
- package/docs/API/10-lang/10-common/10-equal.ts +31 -0
- package/docs/API/10-lang/10-common/10-escapeRegExp.ts +11 -0
- package/docs/API/10-lang/10-common/10-falsy.ts +12 -0
- package/docs/API/10-lang/10-common/10-forward.ts +11 -0
- package/docs/API/10-lang/10-common/10-forwardAsserts.ts +17 -0
- package/docs/API/10-lang/10-common/10-forwardLog.ts +11 -0
- package/docs/API/10-lang/10-common/10-infer.ts +16 -0
- package/docs/API/10-lang/10-common/10-innerPipe.ts +23 -0
- package/docs/API/10-lang/10-common/10-instanceOf.ts +23 -0
- package/docs/API/10-lang/10-common/10-isType.ts +29 -0
- package/docs/API/10-lang/10-common/10-justExec.ts +28 -0
- package/docs/API/10-lang/10-common/10-justReturn.ts +19 -0
- package/docs/API/10-lang/10-common/10-loop.ts +20 -0
- package/docs/API/10-lang/10-common/10-memo.ts +12 -0
- package/docs/API/10-lang/10-common/10-memoObject.ts +11 -0
- package/docs/API/10-lang/10-common/10-memoPromise.ts +16 -0
- package/docs/API/10-lang/10-common/10-or.ts +29 -0
- package/docs/API/10-lang/10-common/10-pipe.ts +21 -0
- package/docs/API/10-lang/10-common/10-pipeCall.ts +20 -0
- package/docs/API/10-lang/10-common/10-prepareAsyncPipe.ts +20 -0
- package/docs/API/10-lang/10-common/10-preparePipe.ts +20 -0
- package/docs/API/10-lang/10-common/10-promiseAll.ts +16 -0
- package/docs/API/10-lang/10-common/10-promiseObject.ts +22 -0
- package/docs/API/10-lang/10-common/10-removeConstraint.ts +13 -0
- package/docs/API/10-lang/10-common/10-shameOnYou.ts +20 -0
- package/docs/API/10-lang/10-common/10-simpleClone.ts +12 -0
- package/docs/API/10-lang/10-common/10-stringToBytes.ts +16 -0
- package/docs/API/10-lang/10-common/10-stringToMillisecond.ts +17 -0
- package/docs/API/10-lang/10-common/10-timeout.ts +11 -0
- package/docs/API/10-lang/10-common/10-toCurriedPredicate.ts +28 -0
- package/docs/API/10-lang/10-common/10-toJSON.ts +15 -0
- package/docs/API/10-lang/10-common/10-toNative.ts +15 -0
- package/docs/API/10-lang/10-common/10-toRegExp.ts +17 -0
- package/docs/API/10-lang/10-common/10-transformer.ts +21 -0
- package/docs/API/10-lang/10-common/10-truthy.ts +12 -0
- package/docs/API/10-lang/10-common/10-useAsyncRetry.ts +31 -0
- package/docs/API/10-lang/10-common/10-when.ts +27 -0
- package/docs/API/10-lang/10-common/10-whenElse.ts +28 -0
- package/docs/API/10-lang/10-common/10-whenNot.ts +26 -0
- package/docs/API/10-lang/10-common/index.llms.md +228 -0
- package/docs/API/10-lang/10-common/index.md +3 -0
- package/docs/API/10-lang/10-dataStructure/10-absolutePath.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-allowedCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-array.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-arrayLengthEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-betweenThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-betweenThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-bigint.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-boolean.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-createCodec.ts +45 -0
- package/docs/API/10-lang/10-dataStructure/10-createCodecs.ts +134 -0
- package/docs/API/10-lang/10-dataStructure/10-createErrorInterpreter.ts +74 -0
- package/docs/API/10-lang/10-dataStructure/10-date.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-email.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-endsWith.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-even.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-extend.ts +27 -0
- package/docs/API/10-lang/10-dataStructure/10-greaterThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-greaterThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-include.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-integer.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-isNullStructure.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isNullable.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isOptional.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-isUndefinedStructure.ts +12 -0
- package/docs/API/10-lang/10-dataStructure/10-lazy.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-lessThan.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-lessThanOrEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-literal.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-maxCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-maxElements.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-minCharacters.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-minElements.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-multipleOf.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-negative.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-notEmpty.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-notZero.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-null.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-nullable.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-number.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-numberInString.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-object.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-odd.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-optional.ts +19 -0
- package/docs/API/10-lang/10-dataStructure/10-partial.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-path.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-positive.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-record.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-refine.ts +27 -0
- package/docs/API/10-lang/10-dataStructure/10-regex.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-required.ts +21 -0
- package/docs/API/10-lang/10-dataStructure/10-safe.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-segmentPath.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-startsWith.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-strictNegative.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-strictPositive.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-string.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-stringLengthEqual.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-time.ts +23 -0
- package/docs/API/10-lang/10-dataStructure/10-trimmed.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +33 -0
- package/docs/API/10-lang/10-dataStructure/10-undefined.ts +22 -0
- package/docs/API/10-lang/10-dataStructure/10-union.ts +24 -0
- package/docs/API/10-lang/10-dataStructure/10-unwrapLazy.ts +17 -0
- package/docs/API/10-lang/10-dataStructure/10-url.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/10-uuid.ts +25 -0
- package/docs/API/10-lang/10-dataStructure/index.llms.md +264 -0
- package/docs/API/10-lang/10-dataStructure/index.md +3 -0
- package/docs/API/10-lang/10-either/10-asyncGroup.ts +44 -0
- package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +23 -0
- package/docs/API/10-lang/10-either/10-error.ts +12 -0
- package/docs/API/10-lang/10-either/10-expect.ts +13 -0
- package/docs/API/10-lang/10-either/10-fail.ts +12 -0
- package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +28 -0
- package/docs/API/10-lang/10-either/10-group.ts +58 -0
- package/docs/API/10-lang/10-either/10-hasInformation.ts +24 -0
- package/docs/API/10-lang/10-either/10-isLeft.ts +16 -0
- package/docs/API/10-lang/10-either/10-isRight.ts +16 -0
- package/docs/API/10-lang/10-either/10-isSelected.ts +29 -0
- package/docs/API/10-lang/10-either/10-keepAsRightByInformation.ts +29 -0
- package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +23 -0
- package/docs/API/10-lang/10-either/10-left.ts +13 -0
- package/docs/API/10-lang/10-either/10-matchInformation.ts +26 -0
- package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +27 -0
- package/docs/API/10-lang/10-either/10-none.ts +12 -0
- package/docs/API/10-lang/10-either/10-ok.ts +12 -0
- package/docs/API/10-lang/10-either/10-result.ts +18 -0
- package/docs/API/10-lang/10-either/10-rewriteInformation.ts +24 -0
- package/docs/API/10-lang/10-either/10-right.ts +13 -0
- package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +69 -0
- package/docs/API/10-lang/10-either/10-rightPipe.ts +72 -0
- package/docs/API/10-lang/10-either/10-safeCallback.ts +29 -0
- package/docs/API/10-lang/10-either/10-some.ts +12 -0
- package/docs/API/10-lang/10-either/10-success.ts +12 -0
- package/docs/API/10-lang/10-either/10-toMaybe.ts +53 -0
- package/docs/API/10-lang/10-either/10-unwrapByInformation.ts +20 -0
- package/docs/API/10-lang/10-either/10-unwrapByInformationOrThrow.ts +19 -0
- package/docs/API/10-lang/10-either/10-unwrapLeft.ts +14 -0
- package/docs/API/10-lang/10-either/10-unwrapLeftOrThrow.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapOr.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +20 -0
- package/docs/API/10-lang/10-either/10-unwrapRight.ts +14 -0
- package/docs/API/10-lang/10-either/10-unwrapRightOrThrow.ts +17 -0
- package/docs/API/10-lang/10-either/10-unwrapSelection.ts +26 -0
- package/docs/API/10-lang/10-either/10-unwrapSelectionOrThrow.ts +19 -0
- package/docs/API/10-lang/10-either/10-whenHasInformation.ts +35 -0
- package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +29 -0
- package/docs/API/10-lang/10-either/10-whenIsLeft.ts +20 -0
- package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +27 -0
- package/docs/API/10-lang/10-either/10-whenIsRight.ts +20 -0
- package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +26 -0
- package/docs/API/10-lang/10-either/10-whenIsSelected.ts +33 -0
- package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +35 -0
- package/docs/API/10-lang/10-either/index.llms.md +184 -0
- package/docs/API/10-lang/10-either/index.md +3 -0
- package/docs/API/10-lang/10-generator/10-asyncChunk.ts +55 -0
- package/docs/API/10-lang/10-generator/10-asyncConcat.ts +46 -0
- package/docs/API/10-lang/10-generator/10-asyncFilter.ts +41 -0
- package/docs/API/10-lang/10-generator/10-asyncFlat.ts +37 -0
- package/docs/API/10-lang/10-generator/10-asyncGroup.ts +65 -0
- package/docs/API/10-lang/10-generator/10-asyncLoop.ts +59 -0
- package/docs/API/10-lang/10-generator/10-asyncMap.ts +48 -0
- package/docs/API/10-lang/10-generator/10-asyncReduce.ts +63 -0
- package/docs/API/10-lang/10-generator/10-chunk.ts +44 -0
- package/docs/API/10-lang/10-generator/10-concat.ts +37 -0
- package/docs/API/10-lang/10-generator/10-createExternalAsyncGenerator.ts +29 -0
- package/docs/API/10-lang/10-generator/10-execute.ts +44 -0
- package/docs/API/10-lang/10-generator/10-filter.ts +35 -0
- package/docs/API/10-lang/10-generator/10-flat.ts +25 -0
- package/docs/API/10-lang/10-generator/10-group.ts +44 -0
- package/docs/API/10-lang/10-generator/10-groupOutput.ts +48 -0
- package/docs/API/10-lang/10-generator/10-loop.ts +55 -0
- package/docs/API/10-lang/10-generator/10-map.ts +35 -0
- package/docs/API/10-lang/10-generator/10-reduce.ts +51 -0
- package/docs/API/10-lang/10-generator/10-reduceFrom.ts +30 -0
- package/docs/API/10-lang/10-generator/index.llms.md +84 -0
- package/docs/API/10-lang/10-generator/index.md +3 -0
- package/docs/API/10-lang/index.md +3 -0
- package/docs/API/index.md +3 -0
- package/docs/API.llms.md +31 -0
- package/docs/concepts/01-fundamental/01-constraint/01-use.ts +22 -0
- package/docs/concepts/01-fundamental/01-constraint/10-built-in-constraint.ts +37 -0
- package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +38 -0
- package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +62 -0
- package/docs/concepts/01-fundamental/01-constraint/40-custom-constraint.ts +45 -0
- package/docs/concepts/01-fundamental/01-constraint/index.md +3 -0
- package/docs/concepts/01-fundamental/02-currying/01-use.ts +33 -0
- package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +178 -0
- package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +39 -0
- package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +42 -0
- package/docs/concepts/01-fundamental/02-currying/index.md +3 -0
- package/docs/concepts/01-fundamental/03-either/01-use.ts +21 -0
- package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +79 -0
- package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +73 -0
- package/docs/concepts/01-fundamental/03-either/30-composition.ts +72 -0
- package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +40 -0
- package/docs/concepts/01-fundamental/03-either/50-external-results.ts +59 -0
- package/docs/concepts/01-fundamental/03-either/60-contextual-state.ts +40 -0
- package/docs/concepts/01-fundamental/03-either/index.md +3 -0
- package/docs/concepts/01-fundamental/04-data-structure/01-use.ts +22 -0
- package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +193 -0
- package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +78 -0
- package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +100 -0
- package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +151 -0
- package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +48 -0
- package/docs/concepts/01-fundamental/04-data-structure/60-interpret-error.ts +123 -0
- package/docs/concepts/01-fundamental/04-data-structure/index.md +3 -0
- package/docs/concepts/01-fundamental/05-chrono/01-use.ts +14 -0
- package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +59 -0
- package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +94 -0
- package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +73 -0
- package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +81 -0
- package/docs/concepts/01-fundamental/05-chrono/index.md +3 -0
- package/docs/concepts/01-fundamental/06-modeling/10-new-type.ts +42 -0
- package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +204 -0
- package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +181 -0
- package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +275 -0
- package/docs/concepts/01-fundamental/06-modeling/50-evidence.ts +94 -0
- package/docs/concepts/01-fundamental/06-modeling/60-signed-function.ts +26 -0
- package/docs/concepts/01-fundamental/06-modeling/index.md +3 -0
- package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +104 -0
- package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +142 -0
- package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +105 -0
- package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +57 -0
- package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +87 -0
- package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +152 -0
- package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +89 -0
- package/docs/concepts/01-fundamental/07-discrimination/index.md +3 -0
- package/docs/concepts/01-fundamental/index.md +1 -0
- package/docs/concepts/02-server/10-file/10-manipulation.ts +40 -0
- package/docs/concepts/02-server/10-file/20-path.ts +56 -0
- package/docs/concepts/02-server/10-file/index.md +3 -0
- package/docs/concepts/02-server/20-http/10-init.ts +31 -0
- package/docs/concepts/02-server/20-http/20-route.ts +174 -0
- package/docs/concepts/02-server/20-http/30-routine.ts +195 -0
- package/docs/concepts/02-server/20-http/40-jwt.ts +137 -0
- package/docs/concepts/02-server/20-http/50-codegen.ts +29 -0
- package/docs/concepts/02-server/20-http/index.md +3 -0
- package/docs/concepts/02-server/30-environment/10-platform.ts +38 -0
- package/docs/concepts/02-server/30-environment/20-variable.ts +41 -0
- package/docs/concepts/02-server/30-environment/index.md +3 -0
- package/docs/concepts/02-server/40-command/10-use.ts +112 -0
- package/docs/concepts/02-server/40-command/20-sub-command.ts +48 -0
- package/docs/concepts/02-server/40-command/index.md +3 -0
- package/docs/concepts/02-server/index.md +1 -0
- package/docs/concepts/03-client/10-http/10-init.ts +64 -0
- package/docs/concepts/03-client/10-http/20-request.ts +244 -0
- package/docs/concepts/03-client/10-http/30-hook.ts +139 -0
- package/docs/concepts/03-client/10-http/index.md +3 -0
- package/docs/concepts/03-client/20-form/10-init.ts +95 -0
- package/docs/concepts/03-client/20-form/20-input.ts +96 -0
- package/docs/concepts/03-client/20-form/30-layout.ts +160 -0
- package/docs/concepts/03-client/20-form/40-template.ts +89 -0
- package/docs/concepts/03-client/20-form/index.md +3 -0
- package/docs/concepts/03-client/index.md +1 -0
- package/docs/concepts/04-tests/01-unit/10-either.ts +136 -0
- package/docs/concepts/04-tests/01-unit/20-server-mocking.ts +53 -0
- package/docs/concepts/04-tests/01-unit/index.md +3 -0
- package/docs/concepts/04-tests/02-e2e/10-init.ts +80 -0
- package/docs/concepts/04-tests/02-e2e/20-architecture.ts +76 -0
- package/docs/concepts/04-tests/02-e2e/30-testing.ts +90 -0
- package/docs/concepts/04-tests/02-e2e/index.md +3 -0
- package/docs/concepts/04-tests/index.md +1 -0
- package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +41 -0
- package/docs/concepts/05-type-driven-design/01-architecture/index.md +3 -0
- package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +58 -0
- package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +49 -0
- package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +41 -0
- package/docs/concepts/05-type-driven-design/02-domains/index.md +3 -0
- package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +69 -0
- package/docs/concepts/05-type-driven-design/03-applications/index.md +3 -0
- package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +56 -0
- package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/book.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/client.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/email.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +27 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +30 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +32 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +15 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +16 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +21 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +34 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +31 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +30 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +87 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +33 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +32 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +82 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +16 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/client.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/email.ts +12 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/business/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +62 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/index.ts +11 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/main.ts +19 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +37 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +50 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/index.ts +2 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +25 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/client.ts +7 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/email.ts +10 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +3 -0
- package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +12 -0
- package/docs/concepts/05-type-driven-design/index.md +3 -0
- package/docs/concepts.llms.md +475 -0
- package/instructions/coding-conventions.md +8 -0
- package/package.json +96 -3
- package/skills/command/SKILL.md +63 -0
- package/skills/command/references/examples/cli.ts +22 -0
- package/skills/command/references/examples/options-only.ts +27 -0
- package/skills/command/references/examples/preview-command.ts +57 -0
- package/skills/command/references/execution.md +31 -0
- package/skills/command/references/inputs.md +27 -0
- package/skills/fundamental/SKILL.md +80 -0
- package/skills/fundamental/references/composition.md +35 -0
- package/skills/fundamental/references/constraints-and-validation.md +61 -0
- package/skills/fundamental/references/examples/async-composition.ts +15 -0
- package/skills/fundamental/references/examples/cast.ts +18 -0
- package/skills/fundamental/references/examples/composition.ts +40 -0
- package/skills/fundamental/references/examples/environment-initialization.ts +19 -0
- package/skills/fundamental/references/examples/error-propagation.ts +24 -0
- package/skills/fundamental/references/examples/generic-inference.ts +31 -0
- package/skills/fundamental/references/examples/guaranteed-array-access.ts +31 -0
- package/skills/fundamental/references/examples/independent-inputs.ts +18 -0
- package/skills/fundamental/references/examples/infer.ts +21 -0
- package/skills/fundamental/references/examples/input-validation.ts +37 -0
- package/skills/fundamental/references/examples/safe-declarations.ts +25 -0
- package/skills/fundamental/references/results-and-errors.md +59 -0
- package/skills/http-client/SKILL.md +50 -0
- package/skills/http-client/references/configuration.md +9 -0
- package/skills/http-client/references/examples/client-expectations.ts +84 -0
- package/skills/http-client/references/examples/client-streams.ts +74 -0
- package/skills/http-client/references/examples/external-client.ts +78 -0
- package/skills/http-client/references/hooks.md +7 -0
- package/skills/http-client/references/responses.md +39 -0
- package/skills/http-client/references/streams.md +10 -0
- package/skills/http-server/SKILL.md +66 -0
- package/skills/http-server/references/code-generation.md +31 -0
- package/skills/http-server/references/examples/authentication.ts +42 -0
- package/skills/http-server/references/examples/contracts.ts +19 -0
- package/skills/http-server/references/examples/generate-sdk.ts +36 -0
- package/skills/http-server/references/examples/initialize.ts +29 -0
- package/skills/http-server/references/examples/minimal-route.ts +18 -0
- package/skills/http-server/references/examples/protected-route.ts +31 -0
- package/skills/http-server/references/examples/rename-user-route.ts +54 -0
- package/skills/http-server/references/examples/user-checker.ts +26 -0
- package/skills/http-server/references/examples/user-route.ts +38 -0
- package/skills/http-server/references/initialization.md +33 -0
- package/skills/http-server/references/reusable-flows.md +40 -0
- package/skills/http-server/references/routes-and-floor.md +38 -0
- package/skills/modeling/SKILL.md +76 -0
- package/skills/modeling/references/domain.md +33 -0
- package/skills/modeling/references/orchestration.md +36 -0
- package/skills/server/SKILL.md +55 -0
- package/skills/server/references/environment.md +30 -0
- package/skills/server/references/examples/environment.ts +41 -0
- package/skills/server/references/examples/file-structure.ts +26 -0
- package/skills/server/references/examples/files.ts +52 -0
- package/skills/server/references/files.md +38 -0
- package/skills/server/references/structures.md +15 -0
- package/skills/test/SKILL.md +70 -0
- package/skills/test/references/examples/results.ts +95 -0
- package/skills/test/references/examples/server.ts +59 -0
- package/skills/test/references/results.md +21 -0
- package/skills/test/references/server.md +17 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Réutilisation des fonctions de l’écosystème dans les pipes.
|
|
3
|
+
*
|
|
4
|
+
* Composer les opérations fournies, sous forme curifiée ou directement compatible avec pipe.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DArray from "@duplojs/lang/array";
|
|
8
|
+
import * as DString from "@duplojs/lang/string";
|
|
9
|
+
import * as DObject from "@duplojs/lang/object";
|
|
10
|
+
import * as DNumber from "@duplojs/lang/number";
|
|
11
|
+
import * as DEither from "@duplojs/lang/either";
|
|
12
|
+
import * as DTuple from "@duplojs/lang/tuple";
|
|
13
|
+
import * as DChrono from "@duplojs/lang/chrono";
|
|
14
|
+
import * as DGenerator from "@duplojs/lang/generator";
|
|
15
|
+
import * as DPattern from "@duplojs/lang/pattern";
|
|
16
|
+
import type * as DPath from "@duplojs/lang/path";
|
|
17
|
+
import * as DSFile from "@duplojs/server/file";
|
|
18
|
+
|
|
19
|
+
// Avant d’écrire une callback ou de recourir à une API native, rechercher une opération
|
|
20
|
+
// fournie par l’écosystème : sa forme curifiée ou son unique argument peut convenir au pipe.
|
|
21
|
+
// Cette démarche s’applique à tous les packages ; les domaines ci-dessous sont des exemples.
|
|
22
|
+
|
|
23
|
+
// Les fonctions de `string` et `array` sont faites pour être composées.
|
|
24
|
+
// readonly (Lowercase<string> & DString.MinCharacters<1>)[] & DArray.MaxElements<4>
|
|
25
|
+
const normalizedNames = DCommon.pipe(
|
|
26
|
+
[" John ", "", " JANE ", " Alice "],
|
|
27
|
+
DArray.map(DString.trim),
|
|
28
|
+
DArray.filter(DString.isNotEmpty),
|
|
29
|
+
DArray.map(DString.toLowerCase),
|
|
30
|
+
DArray.sort(DString.sortCompare),
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
// Les prédicats de `number` peuvent directement être utilisés
|
|
34
|
+
// dans les fonctions de manipulation de tableaux.
|
|
35
|
+
// number
|
|
36
|
+
const adultAges = DCommon.pipe(
|
|
37
|
+
[12, 18, 42, 8, 21],
|
|
38
|
+
DArray.filter(DNumber.greaterThanOrEqual(18)),
|
|
39
|
+
DNumber.sum,
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
// Les fonctions de `object` sont également prévues pour le pipe.
|
|
43
|
+
// {
|
|
44
|
+
// name: string & DString.Trimmed & DString.MaxCharacters<6>;
|
|
45
|
+
// readonly age: 24;
|
|
46
|
+
// }
|
|
47
|
+
const publicUser = DCommon.pipe(
|
|
48
|
+
{
|
|
49
|
+
name: " John ",
|
|
50
|
+
password: "secret",
|
|
51
|
+
age: 24,
|
|
52
|
+
},
|
|
53
|
+
DObject.transformProperty("name", DString.trim),
|
|
54
|
+
DObject.omit(["password"]),
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// `innerPipe` permet de composer plusieurs fonctions intégrées
|
|
58
|
+
// directement à l'endroit où une callback est attendue.
|
|
59
|
+
// readonly { name: Lowercase<string>; }[] & DArray.LengthEqual<2>
|
|
60
|
+
const users = DCommon.pipe(
|
|
61
|
+
[
|
|
62
|
+
{
|
|
63
|
+
name: " John ",
|
|
64
|
+
age: 24,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: " JANE ",
|
|
68
|
+
age: 32,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
DArray.map(
|
|
72
|
+
DCommon.innerPipe(
|
|
73
|
+
DObject.transformProperty(
|
|
74
|
+
"name",
|
|
75
|
+
DCommon.innerPipe(
|
|
76
|
+
DString.trim,
|
|
77
|
+
DString.toLowerCase,
|
|
78
|
+
),
|
|
79
|
+
),
|
|
80
|
+
DObject.pick(["name"]),
|
|
81
|
+
),
|
|
82
|
+
),
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Les fonctions `Either` sont elles aussi composables avec les pipes.
|
|
86
|
+
declare const maybeName:
|
|
87
|
+
| DEither.Right<"user-found", string>
|
|
88
|
+
| DEither.Left<"user-not-found">;
|
|
89
|
+
|
|
90
|
+
// Lowercase<string>
|
|
91
|
+
const name = DCommon.pipe(
|
|
92
|
+
maybeName,
|
|
93
|
+
DEither.unwrapOr("anonymous"),
|
|
94
|
+
DString.trim,
|
|
95
|
+
DString.toLowerCase,
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// `Either` possède également ses propres pipes lorsque le traitement
|
|
99
|
+
// doit continuer uniquement sur une valeur `Right`.
|
|
100
|
+
// DEither.Left<"user-not-found", unknown> | DEither.Success<Lowercase<string>>
|
|
101
|
+
const normalizedEitherName = DEither.rightPipe(
|
|
102
|
+
maybeName,
|
|
103
|
+
DString.trim,
|
|
104
|
+
DString.toLowerCase,
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
// Les tuples disposent eux aussi de fonctions curifiées.
|
|
108
|
+
// readonly [string & DString.Trimmed & DString.MaxCharacters<6>, string & DString.Trimmed & DString.MaxCharacters<6>]
|
|
109
|
+
const normalizedTuple = DCommon.pipe(
|
|
110
|
+
[" John ", " Jane "] as const,
|
|
111
|
+
DTuple.map(DString.trim),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
// Les generators permettent de construire des transformations lazy
|
|
115
|
+
// avec exactement le même modèle de composition.
|
|
116
|
+
// readonly (Lowercase<string> & DString.MinCharacters<1>)[]
|
|
117
|
+
const generatedNames = DCommon.pipe(
|
|
118
|
+
[" John ", "", " JANE ", " Alice "],
|
|
119
|
+
DGenerator.map(DString.trim),
|
|
120
|
+
DGenerator.filter(DString.isNotEmpty),
|
|
121
|
+
DGenerator.map(DString.toLowerCase),
|
|
122
|
+
DArray.from,
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
// Les fonctions de date peuvent être utilisées directement dans les pipes.
|
|
126
|
+
declare const creationDate: DChrono.TheDate;
|
|
127
|
+
|
|
128
|
+
// string
|
|
129
|
+
const serializedCreationDate = DCommon.pipe(
|
|
130
|
+
creationDate,
|
|
131
|
+
DChrono.formatDate(
|
|
132
|
+
"YYYY-MM-DD HH:mm:ss",
|
|
133
|
+
"Europe/Paris",
|
|
134
|
+
),
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Le pattern matching fournit également des fonctions curifiées.
|
|
138
|
+
declare const status: "draft" | "published" | "archived";
|
|
139
|
+
|
|
140
|
+
// "Draft" | "Published" | "Archived"
|
|
141
|
+
const statusLabel = DCommon.pipe(
|
|
142
|
+
status,
|
|
143
|
+
DPattern.matchWithStringOtherwise(
|
|
144
|
+
{
|
|
145
|
+
draft: () => "Draft" as const,
|
|
146
|
+
published: () => "Published" as const,
|
|
147
|
+
},
|
|
148
|
+
() => "Archived" as const,
|
|
149
|
+
),
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
// Les fonctions n'ont pas besoin d'être curifiées lorsqu'elles reçoivent
|
|
153
|
+
// déjà la donnée comme unique argument : elles peuvent être utilisées
|
|
154
|
+
// directement comme étape du pipe.
|
|
155
|
+
declare const filePath: string & DPath.Path;
|
|
156
|
+
|
|
157
|
+
// string & DString.Trimmed
|
|
158
|
+
const fileContent = await DCommon.asyncPipe(
|
|
159
|
+
filePath,
|
|
160
|
+
DSFile.readTextFile,
|
|
161
|
+
DEither.unwrapOr(""),
|
|
162
|
+
DString.trim,
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
// Les fonctions curifiées existent également dans `@duplojs/server`.
|
|
166
|
+
// DSFile.WriteTextFileResult
|
|
167
|
+
const writeResult = await DCommon.asyncPipe(
|
|
168
|
+
filePath,
|
|
169
|
+
DSFile.writeTextFile("Hello world"),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
// Cela permet de composer des traitements provenant de plusieurs packages.
|
|
173
|
+
// DCommon.Json | {}
|
|
174
|
+
const jsonContent = await DCommon.asyncPipe(
|
|
175
|
+
filePath,
|
|
176
|
+
DSFile.readJsonFile,
|
|
177
|
+
DEither.unwrapOr({}),
|
|
178
|
+
);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Composition dans une callback.
|
|
3
|
+
*
|
|
4
|
+
* Enchaîner des transformations lorsque la fonction appelante attend une fonction.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DArray from "@duplojs/lang/array";
|
|
8
|
+
import * as DString from "@duplojs/lang/string";
|
|
9
|
+
|
|
10
|
+
// `innerPipe` permet d'enchaîner plusieurs transformations lorsqu'une
|
|
11
|
+
// fonction de transformation est elle-même attendue.
|
|
12
|
+
//
|
|
13
|
+
// readonly (Lowercase<string> & DString.NotEmpty)[] & DArray.MaxElements<3>
|
|
14
|
+
const normalizedTagsWithInnerPipe = DCommon.pipe(
|
|
15
|
+
" TypeScript, DuploJS, Functional " as const,
|
|
16
|
+
DString.split(","),
|
|
17
|
+
DArray.map(
|
|
18
|
+
DCommon.innerPipe(
|
|
19
|
+
DString.trim,
|
|
20
|
+
DString.toLowerCase,
|
|
21
|
+
),
|
|
22
|
+
),
|
|
23
|
+
DArray.filter(DString.isNotEmpty),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
// `innerPipe` évite de créer une callback intermédiaire uniquement
|
|
27
|
+
// pour enchaîner plusieurs transformations.
|
|
28
|
+
//
|
|
29
|
+
// readonly (number & Positive)[] & DArray.LengthEqual<3> & DArray.MinElements<3> & DArray.MaxElements<3>
|
|
30
|
+
const tagLengths = DCommon.pipe(
|
|
31
|
+
" TypeScript, DuploJS, Functional " as const,
|
|
32
|
+
DString.split(","),
|
|
33
|
+
DArray.map(
|
|
34
|
+
DCommon.innerPipe(
|
|
35
|
+
DString.trim,
|
|
36
|
+
DString.length,
|
|
37
|
+
),
|
|
38
|
+
),
|
|
39
|
+
);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Composition de traitements asynchrones.
|
|
3
|
+
*
|
|
4
|
+
* Enchaîner des étapes synchrones et asynchrones dans un pipe ou une callback.
|
|
5
|
+
*/
|
|
6
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
7
|
+
import * as DArray from "@duplojs/lang/array";
|
|
8
|
+
import * as DString from "@duplojs/lang/string";
|
|
9
|
+
|
|
10
|
+
// `asyncPipe` applique le même principe lorsqu'une ou plusieurs étapes
|
|
11
|
+
// du traitement sont asynchrones.
|
|
12
|
+
//
|
|
13
|
+
// Promise<readonly Lowercase<string>[] & DArray.LengthEqual<2> & DArray.MinElements<2> & DArray.MaxElements<2>>
|
|
14
|
+
const asyncTags = DCommon.asyncPipe(
|
|
15
|
+
Promise.resolve(" TypeScript, DuploJS " as const),
|
|
16
|
+
DString.split(","),
|
|
17
|
+
DArray.map(DString.trim),
|
|
18
|
+
(tags) => Promise.resolve(tags),
|
|
19
|
+
DArray.map(DString.toLowerCase),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
// `asyncInnerPipe` permet de composer plusieurs transformations synchrones
|
|
23
|
+
// ou asynchrones lorsqu'une callback asynchrone est attendue.
|
|
24
|
+
//
|
|
25
|
+
// Promise<readonly Promise<Lowercase<string>>[] & DArray.LengthEqual<2>>
|
|
26
|
+
// map produit ici un tableau de promesses ; asyncPipe attend chaque étape, pas chaque élément.
|
|
27
|
+
const values = DCommon.asyncPipe(
|
|
28
|
+
[" TypeScript ", " DuploJS "] as const,
|
|
29
|
+
DArray.map(
|
|
30
|
+
DCommon.asyncInnerPipe(
|
|
31
|
+
(value) => Promise.resolve(value),
|
|
32
|
+
DString.trim,
|
|
33
|
+
DString.toLowerCase,
|
|
34
|
+
),
|
|
35
|
+
),
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// Pour récupérer les valeurs résolues, ajouter une étape qui attend toutes les promesses.
|
|
39
|
+
const resolvedValues = DCommon.asyncPipe(
|
|
40
|
+
values,
|
|
41
|
+
DCommon.promiseAll,
|
|
42
|
+
);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Représentation des résultats avec Either.
|
|
3
|
+
*
|
|
4
|
+
* Statuts Right et Left, information contextuelle et valeur associée.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
|
|
8
|
+
// Un résultat porte un statut, une information qui identifie le cas et une valeur.
|
|
9
|
+
const result = DEither.right("user-found", { name: "Alice" });
|
|
10
|
+
const missing = DEither.left("user-not-found");
|
|
11
|
+
|
|
12
|
+
// Les variantes fournies reposent sur Right (Success, Some, Result, Ok) ou Left
|
|
13
|
+
// (Fail, Error, None).
|
|
14
|
+
// Result décrit un état contextualisé sans décider s’il constitue un succès ou un échec.
|
|
15
|
+
// Un contrat exprime les résultats possibles par une union, avec des informations
|
|
16
|
+
// personnalisées ou des variantes fournies.
|
|
17
|
+
// Dès qu'une branche d'une fonction renvoie un Right ou un Left, toutes ses
|
|
18
|
+
// branches renvoient un Either. Envelopper les valeurs de réussite dans un Right,
|
|
19
|
+
// y compris avec ok() pour une réussite sans valeur ; ne pas mélanger des Either
|
|
20
|
+
// et des valeurs brutes dans le contrat de retour.
|
|
21
|
+
type FindUserResult = DEither.Right<"user-found", { name: "Alice" }> | DEither.Left<"user-not-found", undefined>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Discrimination et extraction des résultats.
|
|
3
|
+
*
|
|
4
|
+
* Choisir une branche par statut ou information, extraire sa valeur et traiter les autres cas.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
8
|
+
|
|
9
|
+
declare const myResult: (
|
|
10
|
+
| DEither.Success<"result">
|
|
11
|
+
| DEither.Left<"fail-task", Error>
|
|
12
|
+
| DEither.Fail
|
|
13
|
+
| DEither.Error<Error>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
// Choisir Right ou Left lorsque seul le statut du résultat compte.
|
|
17
|
+
// whenIsRight transforme la valeur contenue dans un Right et transmet les Left tels quels.
|
|
18
|
+
// "result" | DEither.Left<"fail-task", Error> | DEither.Fail | DEither.Error<Error>
|
|
19
|
+
const resultWhenIsRight = DCommon.pipe(
|
|
20
|
+
myResult,
|
|
21
|
+
DEither.whenIsRight(
|
|
22
|
+
(rightValue) => rightValue,
|
|
23
|
+
),
|
|
24
|
+
);
|
|
25
|
+
// void | DEither.Success<"result"> | Error
|
|
26
|
+
const resultUnwrapLeft = DEither.unwrapLeft(myResult);
|
|
27
|
+
// unwrapLeft extrait la valeur des Left et conserve les autres résultats enveloppés.
|
|
28
|
+
|
|
29
|
+
// Choisir une information lorsque le cas précis compte, quel que soit son statut.
|
|
30
|
+
// La callback reçoit ici l’Error contenue dans le Left "fail-task".
|
|
31
|
+
// DEither.Success<"result"> | DEither.Fail | DEither.Error<Error> | "test"
|
|
32
|
+
const resultWhenHasInformation = DCommon.pipe(
|
|
33
|
+
myResult,
|
|
34
|
+
DEither.whenHasInformation(
|
|
35
|
+
"fail-task",
|
|
36
|
+
(error) => "test" as const,
|
|
37
|
+
),
|
|
38
|
+
);
|
|
39
|
+
// "result" | Error | DEither.Fail | DEither.Error<Error>
|
|
40
|
+
const resultUnwrapByInformation = DCommon.pipe(
|
|
41
|
+
myResult,
|
|
42
|
+
DEither.unwrapByInformation(
|
|
43
|
+
["success", "fail-task"],
|
|
44
|
+
),
|
|
45
|
+
);
|
|
46
|
+
// Les variantes non ciblées sont conservées dans le résultat et dans son type.
|
|
47
|
+
|
|
48
|
+
// Les variantes Otherwise traitent aussi les cas non ciblés, au lieu de les transmettre.
|
|
49
|
+
// "right" | "left"
|
|
50
|
+
const resultWhenIsRightOtherwise = DCommon.pipe(
|
|
51
|
+
myResult,
|
|
52
|
+
DEither.whenIsRightOtherwise(
|
|
53
|
+
// "result"
|
|
54
|
+
(rightValue) => "right" as const,
|
|
55
|
+
// DEither.Left<"fail-task", Error> | DEither.Fail | DEither.Error<Error>
|
|
56
|
+
(leftResult) => "left" as const,
|
|
57
|
+
),
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Les variantes OrThrow extraient les cas ciblés et lèvent une exception pour les autres.
|
|
61
|
+
// "result" | Error
|
|
62
|
+
const resultUnwrapByInformationOrThrow = DCommon.pipe(
|
|
63
|
+
myResult,
|
|
64
|
+
DEither.unwrapByInformationOrThrow(
|
|
65
|
+
["success", "fail-task"],
|
|
66
|
+
),
|
|
67
|
+
);
|
|
68
|
+
// Utile notamment pour affirmer le résultat attendu dans un test unitaire.
|
|
69
|
+
|
|
70
|
+
// Les predicates réduisent le type dans une branche conditionnelle.
|
|
71
|
+
if (DEither.hasInformation(myResult, "success")) {
|
|
72
|
+
// DEither.Success<"result">
|
|
73
|
+
void myResult;
|
|
74
|
+
}
|
|
75
|
+
// isRight et isLeft réduisent aussi le type selon le statut du résultat.
|
|
76
|
+
if (DEither.isLeft(myResult)) {
|
|
77
|
+
// Error | void
|
|
78
|
+
const leftValue = DEither.unwrapLeft(myResult);
|
|
79
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Décisions exhaustives sur les résultats.
|
|
3
|
+
*
|
|
4
|
+
* Sélection et traitement de chaque variante pour détecter les évolutions du contrat.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
8
|
+
|
|
9
|
+
declare const myResult: (
|
|
10
|
+
| DEither.Success<"result">
|
|
11
|
+
| DEither.Left<"fail-task", Error>
|
|
12
|
+
| DEither.Fail
|
|
13
|
+
| DEither.Error<Error>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
// Sélectionner plusieurs variantes avec une décision explicite pour chacune.
|
|
17
|
+
// DEither.Left<"fail-task", Error> | DEither.Fail | "test"
|
|
18
|
+
const resultWhenIsSelected = DCommon.pipe(
|
|
19
|
+
myResult,
|
|
20
|
+
DEither.whenIsSelected(
|
|
21
|
+
{
|
|
22
|
+
"fail-task": false,
|
|
23
|
+
error: true,
|
|
24
|
+
fail: false,
|
|
25
|
+
success: true,
|
|
26
|
+
},
|
|
27
|
+
(value) => "test" as const,
|
|
28
|
+
),
|
|
29
|
+
);
|
|
30
|
+
// DEither.Success<"result"> | Error | DEither.Left<"fail-task", Error> | DEither.Fail
|
|
31
|
+
const resultUnwrapSelection = DCommon.pipe(
|
|
32
|
+
myResult,
|
|
33
|
+
DEither.unwrapSelection(
|
|
34
|
+
{
|
|
35
|
+
"fail-task": false,
|
|
36
|
+
error: true,
|
|
37
|
+
fail: false,
|
|
38
|
+
success: false,
|
|
39
|
+
},
|
|
40
|
+
),
|
|
41
|
+
);
|
|
42
|
+
// Chaque information doit apparaître dans le sélecteur, même lorsqu’elle vaut false.
|
|
43
|
+
// Ajouter une variante au contrat oblige à réviser la sélection à cet endroit.
|
|
44
|
+
// Cela place la décision dans la couche qui doit la prendre, plutôt que de transmettre
|
|
45
|
+
// involontairement un nouveau résultat à une couche qui ne sait pas le traiter.
|
|
46
|
+
|
|
47
|
+
// matchInformation impose une callback pour chaque information.
|
|
48
|
+
// Chaque callback reçoit la valeur contenue dans la variante correspondante.
|
|
49
|
+
// "fail-task" | "success" | "fail" | "error"
|
|
50
|
+
const resultMatchInformation = DCommon.pipe(
|
|
51
|
+
myResult,
|
|
52
|
+
DEither.matchInformation(
|
|
53
|
+
{
|
|
54
|
+
// Error
|
|
55
|
+
"fail-task": (value) => "fail-task" as const,
|
|
56
|
+
// Error
|
|
57
|
+
error: (value) => "error" as const,
|
|
58
|
+
// void
|
|
59
|
+
fail: (value) => "fail" as const,
|
|
60
|
+
// "result"
|
|
61
|
+
success: (value) => "success" as const,
|
|
62
|
+
},
|
|
63
|
+
),
|
|
64
|
+
);
|
|
65
|
+
// matchInformationOtherwise autorise un traitement partiel avec une branche de repli.
|
|
66
|
+
const resultWithFallback = DCommon.pipe(
|
|
67
|
+
myResult,
|
|
68
|
+
DEither.matchInformationOtherwise(
|
|
69
|
+
{ success: (value) => value },
|
|
70
|
+
(otherResult) => "unhandled" as const,
|
|
71
|
+
),
|
|
72
|
+
);
|
|
73
|
+
// Les fonctions whenIsSelected disposent aussi d’une variante Otherwise.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Composition avec propagation des échecs.
|
|
3
|
+
*
|
|
4
|
+
* Enchaîner ou regrouper des opérations en arrêtant le traitement au premier Left.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DArray from "@duplojs/lang/array";
|
|
8
|
+
import * as DString from "@duplojs/lang/string";
|
|
9
|
+
|
|
10
|
+
declare const myResult: (
|
|
11
|
+
| DEither.Success<"result">
|
|
12
|
+
| DEither.Left<"fail-task", Error>
|
|
13
|
+
| DEither.Fail
|
|
14
|
+
| DEither.Error<Error>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// `rightPipe` transmet aux étapes la valeur contenue par les Right, jamais le
|
|
18
|
+
// wrapper `Right` lui-même. Dès qu’un Left apparaît, les étapes suivantes sont
|
|
19
|
+
// ignorées et ce Left est retourné. Une valeur finale brute est enveloppée dans
|
|
20
|
+
// Success ; un Right final est conservé.
|
|
21
|
+
// DEither.Left<"fail-task", Error> | DEither.Fail | DEither.Error<Error>
|
|
22
|
+
// | DEither.Left<"wrong", undefined> | DEither.Success<string>
|
|
23
|
+
const resultRightPipe = DEither.rightPipe(
|
|
24
|
+
myResult,
|
|
25
|
+
DString.split(""),
|
|
26
|
+
(value) => {
|
|
27
|
+
const elementAt = DArray.at(value, 10);
|
|
28
|
+
if (!elementAt) {
|
|
29
|
+
return DEither.left("wrong");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return DEither.success(elementAt);
|
|
33
|
+
},
|
|
34
|
+
// Cette étape reçoit la string du Success retourné ci-dessus, pas son wrapper.
|
|
35
|
+
(value) => value.toUpperCase(),
|
|
36
|
+
);
|
|
37
|
+
// `rightAsyncPipe` applique le même arrêt sur Left et attend chaque étape
|
|
38
|
+
// asynchrone. Une étape peut retourner un Either : s’il s’agit d’un Right,
|
|
39
|
+
// l’étape suivante reçoit encore sa valeur déballée ; s’il s’agit d’un Left,
|
|
40
|
+
// la suite est ignorée.
|
|
41
|
+
const asyncResult = DEither.rightAsyncPipe(
|
|
42
|
+
Promise.resolve(myResult),
|
|
43
|
+
(value) => Promise.resolve(DEither.right("normalized", value)),
|
|
44
|
+
DString.toLowerCase,
|
|
45
|
+
);
|
|
46
|
+
// La dernière callback retourne une string brute : `asyncResult` est donc un
|
|
47
|
+
// `Success<string>`, tandis que le `Right<"normalized", ...>` intermédiaire
|
|
48
|
+
// n’est pas transmis comme wrapper à la callback suivante.
|
|
49
|
+
// Si une étape intermédiaire produit un `Result` dont une information doit être
|
|
50
|
+
// sélectionnée, composez sa sélection dans cette même callback avec
|
|
51
|
+
// `DCommon.asyncPipe`. Une étape séparée de `rightAsyncPipe` recevrait la valeur
|
|
52
|
+
// du `Right`, et non le `Result` qui porte l’information.
|
|
53
|
+
|
|
54
|
+
// group rassemble les valeurs des Right dans un Success, ou retourne le premier Left.
|
|
55
|
+
// Les getters sont appelés dans l’ordre et ceux placés après un Left ne sont pas exécutés.
|
|
56
|
+
// Les valeurs déjà calculées avant l’appel à group ne peuvent pas être annulées.
|
|
57
|
+
// DEither.Left<"fail-task", Error> | DEither.Fail | DEither.Error<Error> | DEither.Error<"errorDeLaMort">
|
|
58
|
+
// | DEither.Success<{
|
|
59
|
+
// result1: "result";
|
|
60
|
+
// result2: "mySuperResult";
|
|
61
|
+
// result3: never;
|
|
62
|
+
// }>
|
|
63
|
+
const groupResult = DEither.group({
|
|
64
|
+
result1: () => myResult,
|
|
65
|
+
result2: DEither.success("mySuperResult"),
|
|
66
|
+
result3: DEither.error("errorDeLaMort"),
|
|
67
|
+
});
|
|
68
|
+
// asyncGroup attend chaque résultat dans l’ordre, sans lancer les getters en parallèle.
|
|
69
|
+
const asyncGroupResult = DEither.asyncGroup({
|
|
70
|
+
result1: () => Promise.resolve(myResult),
|
|
71
|
+
result2: () => Promise.resolve(DEither.success("mySuperResult")),
|
|
72
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Adaptation des résultats au contexte.
|
|
3
|
+
*
|
|
4
|
+
* Reclasser les statuts et renommer les informations en conservant les valeurs.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
8
|
+
|
|
9
|
+
declare const myResult: (
|
|
10
|
+
| DEither.Success<"result">
|
|
11
|
+
| DEither.Left<"fail-task", Error>
|
|
12
|
+
| DEither.Fail
|
|
13
|
+
| DEither.Error<Error>
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
// Réinterpréter les statuts selon le contexte : true donne Right, false donne Left.
|
|
17
|
+
// L’information et la valeur sont conservées ; le sélecteur couvre toutes les variantes.
|
|
18
|
+
// DEither.Left<"fail", void> | DEither.Left<"error", Error> | DEither.Left<"success", "result">
|
|
19
|
+
// | DEither.Right<"fail-task", Error>
|
|
20
|
+
const resultKeepAsRightSelection = DCommon.pipe(
|
|
21
|
+
myResult,
|
|
22
|
+
DEither.keepAsRightSelection({
|
|
23
|
+
"fail-task": true,
|
|
24
|
+
error: false,
|
|
25
|
+
fail: false,
|
|
26
|
+
success: false,
|
|
27
|
+
}),
|
|
28
|
+
);
|
|
29
|
+
// keepAsRightByInformation sélectionne seulement les informations à considérer comme Right.
|
|
30
|
+
// Toutes les autres deviennent Left, sans imposer de sélecteur exhaustif.
|
|
31
|
+
const resultByInformation = DEither.keepAsRightByInformation(myResult, "fail-task");
|
|
32
|
+
|
|
33
|
+
// Renommer une information adapte le vocabulaire du résultat au contexte appelant.
|
|
34
|
+
// rewriteInformation conserve le statut et la valeur ; les variantes non ciblées restent identiques.
|
|
35
|
+
// DEither.Fail | DEither.Error<Error> | DEither.Left<"fail-task", Error>
|
|
36
|
+
// | DEither.Right<"new-information", "result">
|
|
37
|
+
const resultRewriteInformation = DCommon.pipe(
|
|
38
|
+
myResult,
|
|
39
|
+
DEither.rewriteInformation({ success: "new-information" }),
|
|
40
|
+
);
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title Conversion des absences et exceptions en résultats.
|
|
3
|
+
*
|
|
4
|
+
* Distinguer les refus prévisibles des défaillances d'environnement et adapter les absences ou exceptions en résultats.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DCommon from "@duplojs/lang/common";
|
|
8
|
+
|
|
9
|
+
// Une issue prévisible et exploitable par le traitement appartient à son contrat
|
|
10
|
+
// de résultat : donnée invalide, absence ou refus d'une manipulation. Cela vaut
|
|
11
|
+
// aussi pour les opérations techniques ; toute vérification de donnée externe
|
|
12
|
+
// produit un Either pour laisser l'appelant décider de la suite.
|
|
13
|
+
// Lors d'une défaillance imprévue de l'environnement, les dépendances ou le runtime
|
|
14
|
+
// peuvent déjà lever une exception. Elle remonte implicitement à travers les appels ;
|
|
15
|
+
// le code applicatif n'ajoute pas de throw dans les fonctions réutilisables.
|
|
16
|
+
// Un throw explicite ou une conversion par OrThrow appartient à la consommation
|
|
17
|
+
// finale du résultat, lorsque la frontière d'exécution décide de sa conséquence.
|
|
18
|
+
// La distinction dépend du rôle de l'échec, pas de sa rareté ni du coût de propagation.
|
|
19
|
+
// Le seul fait d'accéder à une ressource extérieure ne transforme pas une absence
|
|
20
|
+
// prévue par l'opération en défaillance de l'environnement.
|
|
21
|
+
|
|
22
|
+
// Maybe représente une présence ou une absence : Some<Value> est un Right, None est un Left.
|
|
23
|
+
// toMaybe convertit null et undefined en None et les valeurs présentes en Some.
|
|
24
|
+
// Un Either déjà construit est transmis tel quel.
|
|
25
|
+
|
|
26
|
+
declare function someFunction(): string | number | null | undefined;
|
|
27
|
+
|
|
28
|
+
// DEither.None | DEither.Some<string> | DEither.Some<number>
|
|
29
|
+
const resultToMaybe = DEither.toMaybe(someFunction());
|
|
30
|
+
|
|
31
|
+
interface User {
|
|
32
|
+
name: string;
|
|
33
|
+
}
|
|
34
|
+
declare function findUser(): DEither.Maybe<User>;
|
|
35
|
+
|
|
36
|
+
// Une transformation sur Some reçoit le User ; None est transmis sans exécuter la callback.
|
|
37
|
+
// DEither.None | DEither.Success<string>
|
|
38
|
+
const userName = DCommon.pipe(
|
|
39
|
+
findUser(),
|
|
40
|
+
DEither.whenIsRight((user) => DEither.success(user.name)),
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Une API qui lève sur un refus prévisible doit être adaptée pour le rendre
|
|
44
|
+
// exploitable comme résultat. Ne pas déduire la nature de l'échec du choix de cette API.
|
|
45
|
+
// safeCallback transforme une exception en SafeCallbackError, dont la valeur est unknown.
|
|
46
|
+
// Une valeur brute devient SafeCallbackSuccess ; un Either retourné est conservé.
|
|
47
|
+
// La capture est large : distinguer le refus documenté d'une cause technique.
|
|
48
|
+
// Conserver cette cause dans le résultat jusqu'à sa consommation finale, sans
|
|
49
|
+
// la requalifier en refus métier ni la relancer depuis une fonction réutilisable.
|
|
50
|
+
// DEither.SafeCallbackError | DEither.SafeCallbackSuccess<"test">
|
|
51
|
+
const resultSafeCallback = DEither.safeCallback(
|
|
52
|
+
() => "test" as const,
|
|
53
|
+
);
|
|
54
|
+
// asyncSafeCallback capture aussi les rejets et retourne toujours une Promise de résultat.
|
|
55
|
+
declare function loadValue(): Promise<string>;
|
|
56
|
+
const asyncSafeResult = DEither.asyncSafeCallback(loadValue);
|
|
57
|
+
|
|
58
|
+
// safeCallback gère aussi les promesses, mais une exception synchrone peut produire
|
|
59
|
+
// directement un Left : préférer asyncSafeCallback pour un retour toujours asynchrone.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @title États contextualisés avec Result.
|
|
3
|
+
*
|
|
4
|
+
* Décrire et discriminer des états sans leur attribuer un sens de succès ou d’échec.
|
|
5
|
+
*/
|
|
6
|
+
import * as DEither from "@duplojs/lang/either";
|
|
7
|
+
import * as DString from "@duplojs/lang/string";
|
|
8
|
+
|
|
9
|
+
// Result<Information, Value> étend Right et porte un marqueur Result supplémentaire.
|
|
10
|
+
// Il exprime un constat : l’appelant décide du sens de cet état dans son contexte.
|
|
11
|
+
// Une fonction peut ainsi renvoyer uniquement des Result, sans branche Left.
|
|
12
|
+
type EmailState = (
|
|
13
|
+
| DEither.Result<"valid-email", string & DString.Email>
|
|
14
|
+
| DEither.Result<"invalid-email", string>
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
// Le format est vérifié, mais la fonction ne décide pas si l’état observé est un échec.
|
|
18
|
+
// Un format invalide peut être précisément l’état recherché lors d’un nettoyage de données.
|
|
19
|
+
function classifyEmail(input: string): EmailState {
|
|
20
|
+
if (DString.isEmail(input)) {
|
|
21
|
+
return DEither.result("valid-email", input);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return DEither.result("invalid-email", input);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare const input: string;
|
|
28
|
+
const state = classifyEmail(input);
|
|
29
|
+
|
|
30
|
+
// Les deux variantes sont Right : isRight ne permet pas de distinguer ces états.
|
|
31
|
+
// La discrimination repose sur l’information et affine aussi le type de la valeur.
|
|
32
|
+
if (DEither.hasInformation(state, "valid-email")) {
|
|
33
|
+
const email: string & DString.Email = DEither.unwrapRight(state);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Les outils Either restent disponibles, notamment pour traiter chaque état explicitement.
|
|
37
|
+
const description = DEither.matchInformation(state, {
|
|
38
|
+
"valid-email": (email) => `Format reconnu : ${email}`,
|
|
39
|
+
"invalid-email": (value) => `Format à corriger : ${value}`,
|
|
40
|
+
});
|