@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.
Files changed (551) hide show
  1. package/README.md +73 -2
  2. package/dist/bin/index.d.ts +2 -0
  3. package/dist/bin/index.mjs +7 -0
  4. package/dist/bin/install/index.d.ts +2 -0
  5. package/dist/bin/install/index.mjs +25 -0
  6. package/dist/bin/install/skill.d.ts +28 -0
  7. package/dist/bin/install/skill.mjs +58 -0
  8. package/dist/bin/packagePath.d.ts +2 -0
  9. package/dist/bin/packagePath.mjs +12 -0
  10. package/dist/bin/setup/index.d.ts +12 -0
  11. package/dist/bin/setup/index.mjs +33 -0
  12. package/dist/bin/setup/instructions.d.ts +8 -0
  13. package/dist/bin/setup/instructions.mjs +27 -0
  14. package/dist/index.cjs +1 -0
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.mjs +0 -0
  17. package/docs/API/10-lang/10-array/10-at.ts +65 -0
  18. package/docs/API/10-lang/10-array/10-chunk.ts +42 -0
  19. package/docs/API/10-lang/10-array/10-coalescing.ts +19 -0
  20. package/docs/API/10-lang/10-array/10-concat.ts +34 -0
  21. package/docs/API/10-lang/10-array/10-copyWithin.ts +34 -0
  22. package/docs/API/10-lang/10-array/10-every.ts +25 -0
  23. package/docs/API/10-lang/10-array/10-fill.ts +34 -0
  24. package/docs/API/10-lang/10-array/10-fillAll.ts +34 -0
  25. package/docs/API/10-lang/10-array/10-filter.ts +43 -0
  26. package/docs/API/10-lang/10-array/10-find.ts +33 -0
  27. package/docs/API/10-lang/10-array/10-findAndReplace.ts +35 -0
  28. package/docs/API/10-lang/10-array/10-findAndSpliceDelete.ts +35 -0
  29. package/docs/API/10-lang/10-array/10-findAndSpliceInsert.ts +35 -0
  30. package/docs/API/10-lang/10-array/10-findAndSpliceReplace.ts +24 -0
  31. package/docs/API/10-lang/10-array/10-findDuplicates.ts +19 -0
  32. package/docs/API/10-lang/10-array/10-findIndex.ts +25 -0
  33. package/docs/API/10-lang/10-array/10-findLast.ts +33 -0
  34. package/docs/API/10-lang/10-array/10-findLastIndex.ts +25 -0
  35. package/docs/API/10-lang/10-array/10-first.ts +21 -0
  36. package/docs/API/10-lang/10-array/10-flat.ts +22 -0
  37. package/docs/API/10-lang/10-array/10-flatMap.ts +24 -0
  38. package/docs/API/10-lang/10-array/10-from.ts +25 -0
  39. package/docs/API/10-lang/10-array/10-group.ts +27 -0
  40. package/docs/API/10-lang/10-array/10-groupOutput.ts +30 -0
  41. package/docs/API/10-lang/10-array/10-includes.ts +24 -0
  42. package/docs/API/10-lang/10-array/10-indexOf.ts +24 -0
  43. package/docs/API/10-lang/10-array/10-insert.ts +34 -0
  44. package/docs/API/10-lang/10-array/10-is.ts +15 -0
  45. package/docs/API/10-lang/10-array/10-isLastIndex.ts +24 -0
  46. package/docs/API/10-lang/10-array/10-last.ts +21 -0
  47. package/docs/API/10-lang/10-array/10-lastIndexOf.ts +24 -0
  48. package/docs/API/10-lang/10-array/10-length.ts +28 -0
  49. package/docs/API/10-lang/10-array/10-lengthEqual.ts +39 -0
  50. package/docs/API/10-lang/10-array/10-map.ts +34 -0
  51. package/docs/API/10-lang/10-array/10-maxElements.ts +44 -0
  52. package/docs/API/10-lang/10-array/10-minElements.ts +44 -0
  53. package/docs/API/10-lang/10-array/10-notIncludes.ts +24 -0
  54. package/docs/API/10-lang/10-array/10-pop.ts +23 -0
  55. package/docs/API/10-lang/10-array/10-prepend.ts +34 -0
  56. package/docs/API/10-lang/10-array/10-push.ts +34 -0
  57. package/docs/API/10-lang/10-array/10-reduce.ts +28 -0
  58. package/docs/API/10-lang/10-array/10-reduceFrom.ts +16 -0
  59. package/docs/API/10-lang/10-array/10-reduceRight.ts +28 -0
  60. package/docs/API/10-lang/10-array/10-reverse.ts +25 -0
  61. package/docs/API/10-lang/10-array/10-select.ts +26 -0
  62. package/docs/API/10-lang/10-array/10-set.ts +24 -0
  63. package/docs/API/10-lang/10-array/10-shift.ts +23 -0
  64. package/docs/API/10-lang/10-array/10-slice.ts +24 -0
  65. package/docs/API/10-lang/10-array/10-some.ts +25 -0
  66. package/docs/API/10-lang/10-array/10-sort.ts +34 -0
  67. package/docs/API/10-lang/10-array/10-spliceDelete.ts +34 -0
  68. package/docs/API/10-lang/10-array/10-spliceInsert.ts +34 -0
  69. package/docs/API/10-lang/10-array/10-spliceReplace.ts +24 -0
  70. package/docs/API/10-lang/10-array/10-unshift.ts +34 -0
  71. package/docs/API/10-lang/10-array/index.llms.md +220 -0
  72. package/docs/API/10-lang/10-array/index.md +3 -0
  73. package/docs/API/10-lang/10-chrono/10-addDays.ts +25 -0
  74. package/docs/API/10-lang/10-chrono/10-addHours.ts +25 -0
  75. package/docs/API/10-lang/10-chrono/10-addMilliseconds.ts +25 -0
  76. package/docs/API/10-lang/10-chrono/10-addMinutes.ts +25 -0
  77. package/docs/API/10-lang/10-chrono/10-addMonths.ts +25 -0
  78. package/docs/API/10-lang/10-chrono/10-addSeconds.ts +25 -0
  79. package/docs/API/10-lang/10-chrono/10-addTime.ts +38 -0
  80. package/docs/API/10-lang/10-chrono/10-addWeeks.ts +25 -0
  81. package/docs/API/10-lang/10-chrono/10-addYears.ts +25 -0
  82. package/docs/API/10-lang/10-chrono/10-applyTimezone.ts +29 -0
  83. package/docs/API/10-lang/10-chrono/10-betweenThanDate.ts +27 -0
  84. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualDate.ts +27 -0
  85. package/docs/API/10-lang/10-chrono/10-betweenThanOrEqualTime.ts +27 -0
  86. package/docs/API/10-lang/10-chrono/10-betweenThanTime.ts +27 -0
  87. package/docs/API/10-lang/10-chrono/10-closestTo.ts +48 -0
  88. package/docs/API/10-lang/10-chrono/10-computeTime.ts +35 -0
  89. package/docs/API/10-lang/10-chrono/10-createDate.ts +122 -0
  90. package/docs/API/10-lang/10-chrono/10-createDateOrThrow.ts +39 -0
  91. package/docs/API/10-lang/10-chrono/10-createTime.ts +86 -0
  92. package/docs/API/10-lang/10-chrono/10-createTimeOrThrow.ts +28 -0
  93. package/docs/API/10-lang/10-chrono/10-eachDate.ts +67 -0
  94. package/docs/API/10-lang/10-chrono/10-equalDate.ts +26 -0
  95. package/docs/API/10-lang/10-chrono/10-equalTime.ts +26 -0
  96. package/docs/API/10-lang/10-chrono/10-formatDate.ts +43 -0
  97. package/docs/API/10-lang/10-chrono/10-formatTime.ts +37 -0
  98. package/docs/API/10-lang/10-chrono/10-getDayOfMonth.ts +37 -0
  99. package/docs/API/10-lang/10-chrono/10-getDayOfWeek.ts +30 -0
  100. package/docs/API/10-lang/10-chrono/10-getDayOfYear.ts +28 -0
  101. package/docs/API/10-lang/10-chrono/10-getDifference.ts +29 -0
  102. package/docs/API/10-lang/10-chrono/10-getFirstDayOfMonth.ts +24 -0
  103. package/docs/API/10-lang/10-chrono/10-getFirstDayOfWeek.ts +24 -0
  104. package/docs/API/10-lang/10-chrono/10-getHour.ts +28 -0
  105. package/docs/API/10-lang/10-chrono/10-getLastDayOfMonth.ts +24 -0
  106. package/docs/API/10-lang/10-chrono/10-getLastDayOfWeek.ts +24 -0
  107. package/docs/API/10-lang/10-chrono/10-getMilliseconds.ts +24 -0
  108. package/docs/API/10-lang/10-chrono/10-getMinute.ts +27 -0
  109. package/docs/API/10-lang/10-chrono/10-getMonth.ts +27 -0
  110. package/docs/API/10-lang/10-chrono/10-getSecond.ts +27 -0
  111. package/docs/API/10-lang/10-chrono/10-getTimezoneOffset.ts +28 -0
  112. package/docs/API/10-lang/10-chrono/10-getWeekOfYear.ts +27 -0
  113. package/docs/API/10-lang/10-chrono/10-getYear.ts +27 -0
  114. package/docs/API/10-lang/10-chrono/10-greaterThanDate.ts +26 -0
  115. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualDate.ts +26 -0
  116. package/docs/API/10-lang/10-chrono/10-greaterThanOrEqualTime.ts +26 -0
  117. package/docs/API/10-lang/10-chrono/10-greaterThanTime.ts +26 -0
  118. package/docs/API/10-lang/10-chrono/10-isDate.ts +23 -0
  119. package/docs/API/10-lang/10-chrono/10-isSafeTimeValue.ts +19 -0
  120. package/docs/API/10-lang/10-chrono/10-isSafeTimestamp.ts +19 -0
  121. package/docs/API/10-lang/10-chrono/10-isSerializedTheDate.ts +26 -0
  122. package/docs/API/10-lang/10-chrono/10-isSerializedTheTime.ts +26 -0
  123. package/docs/API/10-lang/10-chrono/10-isTime.ts +23 -0
  124. package/docs/API/10-lang/10-chrono/10-lessThanDate.ts +26 -0
  125. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualDate.ts +26 -0
  126. package/docs/API/10-lang/10-chrono/10-lessThanOrEqualTime.ts +26 -0
  127. package/docs/API/10-lang/10-chrono/10-lessThanTime.ts +26 -0
  128. package/docs/API/10-lang/10-chrono/10-makeSafeTimeValue.ts +19 -0
  129. package/docs/API/10-lang/10-chrono/10-makeSafeTimestamp.ts +19 -0
  130. package/docs/API/10-lang/10-chrono/10-maxDate.ts +23 -0
  131. package/docs/API/10-lang/10-chrono/10-maxTime.ts +23 -0
  132. package/docs/API/10-lang/10-chrono/10-minDate.ts +23 -0
  133. package/docs/API/10-lang/10-chrono/10-minTime.ts +23 -0
  134. package/docs/API/10-lang/10-chrono/10-now.ts +13 -0
  135. package/docs/API/10-lang/10-chrono/10-round.ts +41 -0
  136. package/docs/API/10-lang/10-chrono/10-serialize.ts +23 -0
  137. package/docs/API/10-lang/10-chrono/10-sortDates.ts +32 -0
  138. package/docs/API/10-lang/10-chrono/10-sortTimes.ts +31 -0
  139. package/docs/API/10-lang/10-chrono/10-subtractDays.ts +25 -0
  140. package/docs/API/10-lang/10-chrono/10-subtractHours.ts +25 -0
  141. package/docs/API/10-lang/10-chrono/10-subtractMilliseconds.ts +25 -0
  142. package/docs/API/10-lang/10-chrono/10-subtractMinutes.ts +25 -0
  143. package/docs/API/10-lang/10-chrono/10-subtractMonths.ts +25 -0
  144. package/docs/API/10-lang/10-chrono/10-subtractSeconds.ts +25 -0
  145. package/docs/API/10-lang/10-chrono/10-subtractTime.ts +38 -0
  146. package/docs/API/10-lang/10-chrono/10-subtractWeeks.ts +25 -0
  147. package/docs/API/10-lang/10-chrono/10-subtractYears.ts +25 -0
  148. package/docs/API/10-lang/10-chrono/10-toDateISOString.ts +17 -0
  149. package/docs/API/10-lang/10-chrono/10-toNative.ts +25 -0
  150. package/docs/API/10-lang/10-chrono/10-toTimeValue.ts +17 -0
  151. package/docs/API/10-lang/10-chrono/10-toTimestamp.ts +17 -0
  152. package/docs/API/10-lang/10-chrono/10-today.ts +13 -0
  153. package/docs/API/10-lang/10-chrono/10-tomorrow.ts +13 -0
  154. package/docs/API/10-lang/10-chrono/10-yesterday.ts +13 -0
  155. package/docs/API/10-lang/10-chrono/index.llms.md +332 -0
  156. package/docs/API/10-lang/10-chrono/index.md +3 -0
  157. package/docs/API/10-lang/10-common/10-and.ts +45 -0
  158. package/docs/API/10-lang/10-common/10-asserts.ts +13 -0
  159. package/docs/API/10-lang/10-common/10-asyncInnerPipe.ts +23 -0
  160. package/docs/API/10-lang/10-common/10-asyncLoop.ts +25 -0
  161. package/docs/API/10-lang/10-common/10-asyncPipe.ts +21 -0
  162. package/docs/API/10-lang/10-common/10-callThen.ts +22 -0
  163. package/docs/API/10-lang/10-common/10-cast.ts +16 -0
  164. package/docs/API/10-lang/10-common/10-clone.ts +12 -0
  165. package/docs/API/10-lang/10-common/10-createAsyncRetry.ts +34 -0
  166. package/docs/API/10-lang/10-common/10-createBuilder.ts +19 -0
  167. package/docs/API/10-lang/10-common/10-createEnum.ts +25 -0
  168. package/docs/API/10-lang/10-common/10-createExternalPromise.ts +13 -0
  169. package/docs/API/10-lang/10-common/10-createFormData.ts +16 -0
  170. package/docs/API/10-lang/10-common/10-createInterpolation.ts +12 -0
  171. package/docs/API/10-lang/10-common/10-createQueue.ts +16 -0
  172. package/docs/API/10-lang/10-common/10-createTransformer.ts +16 -0
  173. package/docs/API/10-lang/10-common/10-detachObjectMethod.ts +20 -0
  174. package/docs/API/10-lang/10-common/10-equal.ts +31 -0
  175. package/docs/API/10-lang/10-common/10-escapeRegExp.ts +11 -0
  176. package/docs/API/10-lang/10-common/10-falsy.ts +12 -0
  177. package/docs/API/10-lang/10-common/10-forward.ts +11 -0
  178. package/docs/API/10-lang/10-common/10-forwardAsserts.ts +17 -0
  179. package/docs/API/10-lang/10-common/10-forwardLog.ts +11 -0
  180. package/docs/API/10-lang/10-common/10-infer.ts +16 -0
  181. package/docs/API/10-lang/10-common/10-innerPipe.ts +23 -0
  182. package/docs/API/10-lang/10-common/10-instanceOf.ts +23 -0
  183. package/docs/API/10-lang/10-common/10-isType.ts +29 -0
  184. package/docs/API/10-lang/10-common/10-justExec.ts +28 -0
  185. package/docs/API/10-lang/10-common/10-justReturn.ts +19 -0
  186. package/docs/API/10-lang/10-common/10-loop.ts +20 -0
  187. package/docs/API/10-lang/10-common/10-memo.ts +12 -0
  188. package/docs/API/10-lang/10-common/10-memoObject.ts +11 -0
  189. package/docs/API/10-lang/10-common/10-memoPromise.ts +16 -0
  190. package/docs/API/10-lang/10-common/10-or.ts +29 -0
  191. package/docs/API/10-lang/10-common/10-pipe.ts +21 -0
  192. package/docs/API/10-lang/10-common/10-pipeCall.ts +20 -0
  193. package/docs/API/10-lang/10-common/10-prepareAsyncPipe.ts +20 -0
  194. package/docs/API/10-lang/10-common/10-preparePipe.ts +20 -0
  195. package/docs/API/10-lang/10-common/10-promiseAll.ts +16 -0
  196. package/docs/API/10-lang/10-common/10-promiseObject.ts +22 -0
  197. package/docs/API/10-lang/10-common/10-removeConstraint.ts +13 -0
  198. package/docs/API/10-lang/10-common/10-shameOnYou.ts +20 -0
  199. package/docs/API/10-lang/10-common/10-simpleClone.ts +12 -0
  200. package/docs/API/10-lang/10-common/10-stringToBytes.ts +16 -0
  201. package/docs/API/10-lang/10-common/10-stringToMillisecond.ts +17 -0
  202. package/docs/API/10-lang/10-common/10-timeout.ts +11 -0
  203. package/docs/API/10-lang/10-common/10-toCurriedPredicate.ts +28 -0
  204. package/docs/API/10-lang/10-common/10-toJSON.ts +15 -0
  205. package/docs/API/10-lang/10-common/10-toNative.ts +15 -0
  206. package/docs/API/10-lang/10-common/10-toRegExp.ts +17 -0
  207. package/docs/API/10-lang/10-common/10-transformer.ts +21 -0
  208. package/docs/API/10-lang/10-common/10-truthy.ts +12 -0
  209. package/docs/API/10-lang/10-common/10-useAsyncRetry.ts +31 -0
  210. package/docs/API/10-lang/10-common/10-when.ts +27 -0
  211. package/docs/API/10-lang/10-common/10-whenElse.ts +28 -0
  212. package/docs/API/10-lang/10-common/10-whenNot.ts +26 -0
  213. package/docs/API/10-lang/10-common/index.llms.md +228 -0
  214. package/docs/API/10-lang/10-common/index.md +3 -0
  215. package/docs/API/10-lang/10-dataStructure/10-absolutePath.ts +25 -0
  216. package/docs/API/10-lang/10-dataStructure/10-allowedCharacters.ts +25 -0
  217. package/docs/API/10-lang/10-dataStructure/10-array.ts +23 -0
  218. package/docs/API/10-lang/10-dataStructure/10-arrayLengthEqual.ts +25 -0
  219. package/docs/API/10-lang/10-dataStructure/10-betweenThan.ts +25 -0
  220. package/docs/API/10-lang/10-dataStructure/10-betweenThanOrEqual.ts +25 -0
  221. package/docs/API/10-lang/10-dataStructure/10-bigint.ts +22 -0
  222. package/docs/API/10-lang/10-dataStructure/10-boolean.ts +22 -0
  223. package/docs/API/10-lang/10-dataStructure/10-createCodec.ts +45 -0
  224. package/docs/API/10-lang/10-dataStructure/10-createCodecs.ts +134 -0
  225. package/docs/API/10-lang/10-dataStructure/10-createErrorInterpreter.ts +74 -0
  226. package/docs/API/10-lang/10-dataStructure/10-date.ts +23 -0
  227. package/docs/API/10-lang/10-dataStructure/10-email.ts +25 -0
  228. package/docs/API/10-lang/10-dataStructure/10-endsWith.ts +24 -0
  229. package/docs/API/10-lang/10-dataStructure/10-even.ts +25 -0
  230. package/docs/API/10-lang/10-dataStructure/10-extend.ts +27 -0
  231. package/docs/API/10-lang/10-dataStructure/10-greaterThan.ts +25 -0
  232. package/docs/API/10-lang/10-dataStructure/10-greaterThanOrEqual.ts +25 -0
  233. package/docs/API/10-lang/10-dataStructure/10-include.ts +24 -0
  234. package/docs/API/10-lang/10-dataStructure/10-integer.ts +25 -0
  235. package/docs/API/10-lang/10-dataStructure/10-isNullStructure.ts +12 -0
  236. package/docs/API/10-lang/10-dataStructure/10-isNullable.ts +12 -0
  237. package/docs/API/10-lang/10-dataStructure/10-isOptional.ts +12 -0
  238. package/docs/API/10-lang/10-dataStructure/10-isUndefinedStructure.ts +12 -0
  239. package/docs/API/10-lang/10-dataStructure/10-lazy.ts +23 -0
  240. package/docs/API/10-lang/10-dataStructure/10-lessThan.ts +25 -0
  241. package/docs/API/10-lang/10-dataStructure/10-lessThanOrEqual.ts +25 -0
  242. package/docs/API/10-lang/10-dataStructure/10-literal.ts +19 -0
  243. package/docs/API/10-lang/10-dataStructure/10-maxCharacters.ts +25 -0
  244. package/docs/API/10-lang/10-dataStructure/10-maxElements.ts +25 -0
  245. package/docs/API/10-lang/10-dataStructure/10-minCharacters.ts +25 -0
  246. package/docs/API/10-lang/10-dataStructure/10-minElements.ts +25 -0
  247. package/docs/API/10-lang/10-dataStructure/10-multipleOf.ts +25 -0
  248. package/docs/API/10-lang/10-dataStructure/10-negative.ts +25 -0
  249. package/docs/API/10-lang/10-dataStructure/10-notEmpty.ts +25 -0
  250. package/docs/API/10-lang/10-dataStructure/10-notZero.ts +25 -0
  251. package/docs/API/10-lang/10-dataStructure/10-null.ts +22 -0
  252. package/docs/API/10-lang/10-dataStructure/10-nullable.ts +19 -0
  253. package/docs/API/10-lang/10-dataStructure/10-number.ts +22 -0
  254. package/docs/API/10-lang/10-dataStructure/10-numberInString.ts +25 -0
  255. package/docs/API/10-lang/10-dataStructure/10-object.ts +25 -0
  256. package/docs/API/10-lang/10-dataStructure/10-odd.ts +25 -0
  257. package/docs/API/10-lang/10-dataStructure/10-optional.ts +19 -0
  258. package/docs/API/10-lang/10-dataStructure/10-partial.ts +23 -0
  259. package/docs/API/10-lang/10-dataStructure/10-path.ts +25 -0
  260. package/docs/API/10-lang/10-dataStructure/10-positive.ts +25 -0
  261. package/docs/API/10-lang/10-dataStructure/10-record.ts +22 -0
  262. package/docs/API/10-lang/10-dataStructure/10-refine.ts +27 -0
  263. package/docs/API/10-lang/10-dataStructure/10-regex.ts +24 -0
  264. package/docs/API/10-lang/10-dataStructure/10-required.ts +21 -0
  265. package/docs/API/10-lang/10-dataStructure/10-safe.ts +25 -0
  266. package/docs/API/10-lang/10-dataStructure/10-segmentPath.ts +25 -0
  267. package/docs/API/10-lang/10-dataStructure/10-startsWith.ts +24 -0
  268. package/docs/API/10-lang/10-dataStructure/10-strictNegative.ts +25 -0
  269. package/docs/API/10-lang/10-dataStructure/10-strictPositive.ts +25 -0
  270. package/docs/API/10-lang/10-dataStructure/10-string.ts +22 -0
  271. package/docs/API/10-lang/10-dataStructure/10-stringLengthEqual.ts +25 -0
  272. package/docs/API/10-lang/10-dataStructure/10-time.ts +23 -0
  273. package/docs/API/10-lang/10-dataStructure/10-trimmed.ts +25 -0
  274. package/docs/API/10-lang/10-dataStructure/10-typeStructureIdentifier.ts +33 -0
  275. package/docs/API/10-lang/10-dataStructure/10-undefined.ts +22 -0
  276. package/docs/API/10-lang/10-dataStructure/10-union.ts +24 -0
  277. package/docs/API/10-lang/10-dataStructure/10-unwrapLazy.ts +17 -0
  278. package/docs/API/10-lang/10-dataStructure/10-url.ts +25 -0
  279. package/docs/API/10-lang/10-dataStructure/10-uuid.ts +25 -0
  280. package/docs/API/10-lang/10-dataStructure/index.llms.md +264 -0
  281. package/docs/API/10-lang/10-dataStructure/index.md +3 -0
  282. package/docs/API/10-lang/10-either/10-asyncGroup.ts +44 -0
  283. package/docs/API/10-lang/10-either/10-asyncSafeCallback.ts +23 -0
  284. package/docs/API/10-lang/10-either/10-error.ts +12 -0
  285. package/docs/API/10-lang/10-either/10-expect.ts +13 -0
  286. package/docs/API/10-lang/10-either/10-fail.ts +12 -0
  287. package/docs/API/10-lang/10-either/10-forwardAssertsSelection.ts +28 -0
  288. package/docs/API/10-lang/10-either/10-group.ts +58 -0
  289. package/docs/API/10-lang/10-either/10-hasInformation.ts +24 -0
  290. package/docs/API/10-lang/10-either/10-isLeft.ts +16 -0
  291. package/docs/API/10-lang/10-either/10-isRight.ts +16 -0
  292. package/docs/API/10-lang/10-either/10-isSelected.ts +29 -0
  293. package/docs/API/10-lang/10-either/10-keepAsRightByInformation.ts +29 -0
  294. package/docs/API/10-lang/10-either/10-keepAsRightSelection.ts +23 -0
  295. package/docs/API/10-lang/10-either/10-left.ts +13 -0
  296. package/docs/API/10-lang/10-either/10-matchInformation.ts +26 -0
  297. package/docs/API/10-lang/10-either/10-matchInformationOtherwise.ts +27 -0
  298. package/docs/API/10-lang/10-either/10-none.ts +12 -0
  299. package/docs/API/10-lang/10-either/10-ok.ts +12 -0
  300. package/docs/API/10-lang/10-either/10-result.ts +18 -0
  301. package/docs/API/10-lang/10-either/10-rewriteInformation.ts +24 -0
  302. package/docs/API/10-lang/10-either/10-right.ts +13 -0
  303. package/docs/API/10-lang/10-either/10-rightAsyncPipe.ts +69 -0
  304. package/docs/API/10-lang/10-either/10-rightPipe.ts +72 -0
  305. package/docs/API/10-lang/10-either/10-safeCallback.ts +29 -0
  306. package/docs/API/10-lang/10-either/10-some.ts +12 -0
  307. package/docs/API/10-lang/10-either/10-success.ts +12 -0
  308. package/docs/API/10-lang/10-either/10-toMaybe.ts +53 -0
  309. package/docs/API/10-lang/10-either/10-unwrapByInformation.ts +20 -0
  310. package/docs/API/10-lang/10-either/10-unwrapByInformationOrThrow.ts +19 -0
  311. package/docs/API/10-lang/10-either/10-unwrapLeft.ts +14 -0
  312. package/docs/API/10-lang/10-either/10-unwrapLeftOrThrow.ts +17 -0
  313. package/docs/API/10-lang/10-either/10-unwrapOr.ts +17 -0
  314. package/docs/API/10-lang/10-either/10-unwrapOtherwise.ts +20 -0
  315. package/docs/API/10-lang/10-either/10-unwrapRight.ts +14 -0
  316. package/docs/API/10-lang/10-either/10-unwrapRightOrThrow.ts +17 -0
  317. package/docs/API/10-lang/10-either/10-unwrapSelection.ts +26 -0
  318. package/docs/API/10-lang/10-either/10-unwrapSelectionOrThrow.ts +19 -0
  319. package/docs/API/10-lang/10-either/10-whenHasInformation.ts +35 -0
  320. package/docs/API/10-lang/10-either/10-whenHasInformationOtherwise.ts +29 -0
  321. package/docs/API/10-lang/10-either/10-whenIsLeft.ts +20 -0
  322. package/docs/API/10-lang/10-either/10-whenIsLeftOtherwise.ts +27 -0
  323. package/docs/API/10-lang/10-either/10-whenIsRight.ts +20 -0
  324. package/docs/API/10-lang/10-either/10-whenIsRightOtherwise.ts +26 -0
  325. package/docs/API/10-lang/10-either/10-whenIsSelected.ts +33 -0
  326. package/docs/API/10-lang/10-either/10-whenIsSelectedOtherwise.ts +35 -0
  327. package/docs/API/10-lang/10-either/index.llms.md +184 -0
  328. package/docs/API/10-lang/10-either/index.md +3 -0
  329. package/docs/API/10-lang/10-generator/10-asyncChunk.ts +55 -0
  330. package/docs/API/10-lang/10-generator/10-asyncConcat.ts +46 -0
  331. package/docs/API/10-lang/10-generator/10-asyncFilter.ts +41 -0
  332. package/docs/API/10-lang/10-generator/10-asyncFlat.ts +37 -0
  333. package/docs/API/10-lang/10-generator/10-asyncGroup.ts +65 -0
  334. package/docs/API/10-lang/10-generator/10-asyncLoop.ts +59 -0
  335. package/docs/API/10-lang/10-generator/10-asyncMap.ts +48 -0
  336. package/docs/API/10-lang/10-generator/10-asyncReduce.ts +63 -0
  337. package/docs/API/10-lang/10-generator/10-chunk.ts +44 -0
  338. package/docs/API/10-lang/10-generator/10-concat.ts +37 -0
  339. package/docs/API/10-lang/10-generator/10-createExternalAsyncGenerator.ts +29 -0
  340. package/docs/API/10-lang/10-generator/10-execute.ts +44 -0
  341. package/docs/API/10-lang/10-generator/10-filter.ts +35 -0
  342. package/docs/API/10-lang/10-generator/10-flat.ts +25 -0
  343. package/docs/API/10-lang/10-generator/10-group.ts +44 -0
  344. package/docs/API/10-lang/10-generator/10-groupOutput.ts +48 -0
  345. package/docs/API/10-lang/10-generator/10-loop.ts +55 -0
  346. package/docs/API/10-lang/10-generator/10-map.ts +35 -0
  347. package/docs/API/10-lang/10-generator/10-reduce.ts +51 -0
  348. package/docs/API/10-lang/10-generator/10-reduceFrom.ts +30 -0
  349. package/docs/API/10-lang/10-generator/index.llms.md +84 -0
  350. package/docs/API/10-lang/10-generator/index.md +3 -0
  351. package/docs/API/10-lang/index.md +3 -0
  352. package/docs/API/index.md +3 -0
  353. package/docs/API.llms.md +31 -0
  354. package/docs/concepts/01-fundamental/01-constraint/01-use.ts +22 -0
  355. package/docs/concepts/01-fundamental/01-constraint/10-built-in-constraint.ts +37 -0
  356. package/docs/concepts/01-fundamental/01-constraint/20-manipulation.ts +38 -0
  357. package/docs/concepts/01-fundamental/01-constraint/30-cast.ts +62 -0
  358. package/docs/concepts/01-fundamental/01-constraint/40-custom-constraint.ts +45 -0
  359. package/docs/concepts/01-fundamental/01-constraint/index.md +3 -0
  360. package/docs/concepts/01-fundamental/02-currying/01-use.ts +33 -0
  361. package/docs/concepts/01-fundamental/02-currying/10-built-in-function.ts +178 -0
  362. package/docs/concepts/01-fundamental/02-currying/20-inner-pipe.ts +39 -0
  363. package/docs/concepts/01-fundamental/02-currying/30-async-pipe.ts +42 -0
  364. package/docs/concepts/01-fundamental/02-currying/index.md +3 -0
  365. package/docs/concepts/01-fundamental/03-either/01-use.ts +21 -0
  366. package/docs/concepts/01-fundamental/03-either/10-discrimination.ts +79 -0
  367. package/docs/concepts/01-fundamental/03-either/20-exhaustive-handling.ts +73 -0
  368. package/docs/concepts/01-fundamental/03-either/30-composition.ts +72 -0
  369. package/docs/concepts/01-fundamental/03-either/40-result-adaptation.ts +40 -0
  370. package/docs/concepts/01-fundamental/03-either/50-external-results.ts +59 -0
  371. package/docs/concepts/01-fundamental/03-either/60-contextual-state.ts +40 -0
  372. package/docs/concepts/01-fundamental/03-either/index.md +3 -0
  373. package/docs/concepts/01-fundamental/04-data-structure/01-use.ts +22 -0
  374. package/docs/concepts/01-fundamental/04-data-structure/10-structure.ts +193 -0
  375. package/docs/concepts/01-fundamental/04-data-structure/20-constraint.ts +78 -0
  376. package/docs/concepts/01-fundamental/04-data-structure/30-validation.ts +100 -0
  377. package/docs/concepts/01-fundamental/04-data-structure/40-codecs.ts +151 -0
  378. package/docs/concepts/01-fundamental/04-data-structure/50-recursive.ts +48 -0
  379. package/docs/concepts/01-fundamental/04-data-structure/60-interpret-error.ts +123 -0
  380. package/docs/concepts/01-fundamental/04-data-structure/index.md +3 -0
  381. package/docs/concepts/01-fundamental/05-chrono/01-use.ts +14 -0
  382. package/docs/concepts/01-fundamental/05-chrono/10-creation.ts +59 -0
  383. package/docs/concepts/01-fundamental/05-chrono/20-manipulation.ts +94 -0
  384. package/docs/concepts/01-fundamental/05-chrono/30-serialized.ts +73 -0
  385. package/docs/concepts/01-fundamental/05-chrono/40-timezone.ts +81 -0
  386. package/docs/concepts/01-fundamental/05-chrono/index.md +3 -0
  387. package/docs/concepts/01-fundamental/06-modeling/10-new-type.ts +42 -0
  388. package/docs/concepts/01-fundamental/06-modeling/20-entity.ts +204 -0
  389. package/docs/concepts/01-fundamental/06-modeling/30-tagged-object.ts +181 -0
  390. package/docs/concepts/01-fundamental/06-modeling/40-entity-lifecycle.ts +275 -0
  391. package/docs/concepts/01-fundamental/06-modeling/50-evidence.ts +94 -0
  392. package/docs/concepts/01-fundamental/06-modeling/60-signed-function.ts +26 -0
  393. package/docs/concepts/01-fundamental/06-modeling/index.md +3 -0
  394. package/docs/concepts/01-fundamental/07-discrimination/10-entity.ts +104 -0
  395. package/docs/concepts/01-fundamental/07-discrimination/20-fact.ts +142 -0
  396. package/docs/concepts/01-fundamental/07-discrimination/30-tagged-object.ts +105 -0
  397. package/docs/concepts/01-fundamental/07-discrimination/40-error.ts +57 -0
  398. package/docs/concepts/01-fundamental/07-discrimination/50-literal.ts +87 -0
  399. package/docs/concepts/01-fundamental/07-discrimination/60-shape.ts +152 -0
  400. package/docs/concepts/01-fundamental/07-discrimination/70-predicate.ts +89 -0
  401. package/docs/concepts/01-fundamental/07-discrimination/index.md +3 -0
  402. package/docs/concepts/01-fundamental/index.md +1 -0
  403. package/docs/concepts/02-server/10-file/10-manipulation.ts +40 -0
  404. package/docs/concepts/02-server/10-file/20-path.ts +56 -0
  405. package/docs/concepts/02-server/10-file/index.md +3 -0
  406. package/docs/concepts/02-server/20-http/10-init.ts +31 -0
  407. package/docs/concepts/02-server/20-http/20-route.ts +174 -0
  408. package/docs/concepts/02-server/20-http/30-routine.ts +195 -0
  409. package/docs/concepts/02-server/20-http/40-jwt.ts +137 -0
  410. package/docs/concepts/02-server/20-http/50-codegen.ts +29 -0
  411. package/docs/concepts/02-server/20-http/index.md +3 -0
  412. package/docs/concepts/02-server/30-environment/10-platform.ts +38 -0
  413. package/docs/concepts/02-server/30-environment/20-variable.ts +41 -0
  414. package/docs/concepts/02-server/30-environment/index.md +3 -0
  415. package/docs/concepts/02-server/40-command/10-use.ts +112 -0
  416. package/docs/concepts/02-server/40-command/20-sub-command.ts +48 -0
  417. package/docs/concepts/02-server/40-command/index.md +3 -0
  418. package/docs/concepts/02-server/index.md +1 -0
  419. package/docs/concepts/03-client/10-http/10-init.ts +64 -0
  420. package/docs/concepts/03-client/10-http/20-request.ts +244 -0
  421. package/docs/concepts/03-client/10-http/30-hook.ts +139 -0
  422. package/docs/concepts/03-client/10-http/index.md +3 -0
  423. package/docs/concepts/03-client/20-form/10-init.ts +95 -0
  424. package/docs/concepts/03-client/20-form/20-input.ts +96 -0
  425. package/docs/concepts/03-client/20-form/30-layout.ts +160 -0
  426. package/docs/concepts/03-client/20-form/40-template.ts +89 -0
  427. package/docs/concepts/03-client/20-form/index.md +3 -0
  428. package/docs/concepts/03-client/index.md +1 -0
  429. package/docs/concepts/04-tests/01-unit/10-either.ts +136 -0
  430. package/docs/concepts/04-tests/01-unit/20-server-mocking.ts +53 -0
  431. package/docs/concepts/04-tests/01-unit/index.md +3 -0
  432. package/docs/concepts/04-tests/02-e2e/10-init.ts +80 -0
  433. package/docs/concepts/04-tests/02-e2e/20-architecture.ts +76 -0
  434. package/docs/concepts/04-tests/02-e2e/30-testing.ts +90 -0
  435. package/docs/concepts/04-tests/02-e2e/index.md +3 -0
  436. package/docs/concepts/04-tests/index.md +1 -0
  437. package/docs/concepts/05-type-driven-design/01-architecture/10-boundaries.md +41 -0
  438. package/docs/concepts/05-type-driven-design/01-architecture/index.md +3 -0
  439. package/docs/concepts/05-type-driven-design/02-domains/10-entities.md +58 -0
  440. package/docs/concepts/05-type-driven-design/02-domains/20-aggregates.md +49 -0
  441. package/docs/concepts/05-type-driven-design/02-domains/30-repositories.md +41 -0
  442. package/docs/concepts/05-type-driven-design/02-domains/index.md +3 -0
  443. package/docs/concepts/05-type-driven-design/03-applications/10-use-case.md +69 -0
  444. package/docs/concepts/05-type-driven-design/03-applications/index.md +3 -0
  445. package/docs/concepts/05-type-driven-design/04-infrastructure/10-implementation.md +56 -0
  446. package/docs/concepts/05-type-driven-design/04-infrastructure/index.md +3 -0
  447. package/docs/concepts/05-type-driven-design/fixtures/business/applications/index.ts +2 -0
  448. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/book.ts +10 -0
  449. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/client.ts +10 -0
  450. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/email.ts +7 -0
  451. package/docs/concepts/05-type-driven-design/fixtures/business/applications/ports/index.ts +3 -0
  452. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientGiveBackBook.ts +27 -0
  453. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/clientRentBook.ts +30 -0
  454. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/createBook.ts +32 -0
  455. package/docs/concepts/05-type-driven-design/fixtures/business/applications/useCases/index.ts +2 -0
  456. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientGiveBackBook.ts +15 -0
  457. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/clientRentBook.ts +16 -0
  458. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/createBook.ts +21 -0
  459. package/docs/concepts/05-type-driven-design/fixtures/business/domains/aggregates/index.ts +3 -0
  460. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/create.ts +34 -0
  461. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/index.ts +3 -0
  462. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/rental.ts +31 -0
  463. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/facts/returnBook.ts +30 -0
  464. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/book/index.ts +87 -0
  465. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/giveBackBook.ts +33 -0
  466. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/index.ts +2 -0
  467. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/facts/rentBook.ts +32 -0
  468. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/client/index.ts +82 -0
  469. package/docs/concepts/05-type-driven-design/fixtures/business/domains/entities/index.ts +2 -0
  470. package/docs/concepts/05-type-driven-design/fixtures/business/domains/index.ts +3 -0
  471. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/book.ts +16 -0
  472. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/client.ts +7 -0
  473. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/email.ts +12 -0
  474. package/docs/concepts/05-type-driven-design/fixtures/business/domains/repositories/index.ts +3 -0
  475. package/docs/concepts/05-type-driven-design/fixtures/business/index.ts +2 -0
  476. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/clientRentBook.ts +62 -0
  477. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/command/index.ts +11 -0
  478. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/bookExist.ts +19 -0
  479. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/clientExist.ts +19 -0
  480. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/checkers/index.ts +2 -0
  481. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/main.ts +19 -0
  482. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientGiveBackBook.ts +37 -0
  483. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/clientRentBook.ts +50 -0
  484. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/http/routes/index.ts +2 -0
  485. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/book.ts +25 -0
  486. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/client.ts +7 -0
  487. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/email.ts +10 -0
  488. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/ports/index.ts +3 -0
  489. package/docs/concepts/05-type-driven-design/fixtures/infrastructure/useCases/index.ts +12 -0
  490. package/docs/concepts/05-type-driven-design/index.md +3 -0
  491. package/docs/concepts.llms.md +475 -0
  492. package/instructions/coding-conventions.md +8 -0
  493. package/package.json +96 -3
  494. package/skills/command/SKILL.md +63 -0
  495. package/skills/command/references/examples/cli.ts +22 -0
  496. package/skills/command/references/examples/options-only.ts +27 -0
  497. package/skills/command/references/examples/preview-command.ts +57 -0
  498. package/skills/command/references/execution.md +31 -0
  499. package/skills/command/references/inputs.md +27 -0
  500. package/skills/fundamental/SKILL.md +80 -0
  501. package/skills/fundamental/references/composition.md +35 -0
  502. package/skills/fundamental/references/constraints-and-validation.md +61 -0
  503. package/skills/fundamental/references/examples/async-composition.ts +15 -0
  504. package/skills/fundamental/references/examples/cast.ts +18 -0
  505. package/skills/fundamental/references/examples/composition.ts +40 -0
  506. package/skills/fundamental/references/examples/environment-initialization.ts +19 -0
  507. package/skills/fundamental/references/examples/error-propagation.ts +24 -0
  508. package/skills/fundamental/references/examples/generic-inference.ts +31 -0
  509. package/skills/fundamental/references/examples/guaranteed-array-access.ts +31 -0
  510. package/skills/fundamental/references/examples/independent-inputs.ts +18 -0
  511. package/skills/fundamental/references/examples/infer.ts +21 -0
  512. package/skills/fundamental/references/examples/input-validation.ts +37 -0
  513. package/skills/fundamental/references/examples/safe-declarations.ts +25 -0
  514. package/skills/fundamental/references/results-and-errors.md +59 -0
  515. package/skills/http-client/SKILL.md +50 -0
  516. package/skills/http-client/references/configuration.md +9 -0
  517. package/skills/http-client/references/examples/client-expectations.ts +84 -0
  518. package/skills/http-client/references/examples/client-streams.ts +74 -0
  519. package/skills/http-client/references/examples/external-client.ts +78 -0
  520. package/skills/http-client/references/hooks.md +7 -0
  521. package/skills/http-client/references/responses.md +39 -0
  522. package/skills/http-client/references/streams.md +10 -0
  523. package/skills/http-server/SKILL.md +66 -0
  524. package/skills/http-server/references/code-generation.md +31 -0
  525. package/skills/http-server/references/examples/authentication.ts +42 -0
  526. package/skills/http-server/references/examples/contracts.ts +19 -0
  527. package/skills/http-server/references/examples/generate-sdk.ts +36 -0
  528. package/skills/http-server/references/examples/initialize.ts +29 -0
  529. package/skills/http-server/references/examples/minimal-route.ts +18 -0
  530. package/skills/http-server/references/examples/protected-route.ts +31 -0
  531. package/skills/http-server/references/examples/rename-user-route.ts +54 -0
  532. package/skills/http-server/references/examples/user-checker.ts +26 -0
  533. package/skills/http-server/references/examples/user-route.ts +38 -0
  534. package/skills/http-server/references/initialization.md +33 -0
  535. package/skills/http-server/references/reusable-flows.md +40 -0
  536. package/skills/http-server/references/routes-and-floor.md +38 -0
  537. package/skills/modeling/SKILL.md +76 -0
  538. package/skills/modeling/references/domain.md +33 -0
  539. package/skills/modeling/references/orchestration.md +36 -0
  540. package/skills/server/SKILL.md +55 -0
  541. package/skills/server/references/environment.md +30 -0
  542. package/skills/server/references/examples/environment.ts +41 -0
  543. package/skills/server/references/examples/file-structure.ts +26 -0
  544. package/skills/server/references/examples/files.ts +52 -0
  545. package/skills/server/references/files.md +38 -0
  546. package/skills/server/references/structures.md +15 -0
  547. package/skills/test/SKILL.md +70 -0
  548. package/skills/test/references/examples/results.ts +95 -0
  549. package/skills/test/references/examples/server.ts +59 -0
  550. package/skills/test/references/results.md +21 -0
  551. 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,3 @@
1
+ ## Currification
2
+
3
+ Composition des transformations de données avec les fonctions DuploJS : pipes, callbacks et traitements asynchrones.
@@ -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
+ });
@@ -0,0 +1,3 @@
1
+ ## Either
2
+
3
+ Résultats et états contextualisés : représentation, discrimination, traitement exhaustif, propagation des échecs et adaptation des contrats.