ts-data-forge 3.3.0 → 4.0.0
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 +37 -13
- package/dist/array/impl/array-utils-creation.d.mts +116 -0
- package/dist/array/impl/array-utils-creation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-creation.mjs +110 -0
- package/dist/array/impl/array-utils-creation.mjs.map +1 -0
- package/dist/array/impl/array-utils-element-access.d.mts +60 -0
- package/dist/array/impl/array-utils-element-access.d.mts.map +1 -0
- package/dist/array/impl/array-utils-element-access.mjs +66 -0
- package/dist/array/impl/array-utils-element-access.mjs.map +1 -0
- package/dist/array/impl/array-utils-iterators.d.mts +59 -0
- package/dist/array/impl/array-utils-iterators.d.mts.map +1 -0
- package/dist/array/impl/array-utils-iterators.mjs +104 -0
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -0
- package/dist/array/impl/array-utils-modification.d.mts +154 -0
- package/dist/array/impl/array-utils-modification.d.mts.map +1 -0
- package/dist/array/impl/array-utils-modification.mjs +139 -0
- package/dist/array/impl/array-utils-modification.mjs.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts +213 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.mjs +162 -0
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -0
- package/dist/array/impl/array-utils-search.d.mts +178 -0
- package/dist/array/impl/array-utils-search.d.mts.map +1 -0
- package/dist/array/impl/array-utils-search.mjs +153 -0
- package/dist/array/impl/array-utils-search.mjs.map +1 -0
- package/dist/array/impl/array-utils-set-op.d.mts +100 -0
- package/dist/array/impl/array-utils-set-op.d.mts.map +1 -0
- package/dist/array/impl/array-utils-set-op.mjs +137 -0
- package/dist/array/impl/array-utils-set-op.mjs.map +1 -0
- package/dist/array/impl/array-utils-size.d.mts +24 -0
- package/dist/array/impl/array-utils-size.d.mts.map +1 -0
- package/dist/array/impl/array-utils-size.mjs +28 -0
- package/dist/array/impl/array-utils-size.mjs.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts +18 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs +49 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -0
- package/dist/array/impl/array-utils-slicing.d.mts +120 -0
- package/dist/array/impl/array-utils-slicing.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slicing.mjs +140 -0
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -0
- package/dist/array/impl/array-utils-transformation.d.mts +348 -0
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-transformation.mjs +329 -0
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -0
- package/dist/array/impl/array-utils-validation.d.mts +149 -0
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-validation.mjs +166 -0
- package/dist/array/impl/array-utils-validation.mjs.map +1 -0
- package/dist/array/impl/index.d.mts +13 -0
- package/dist/array/impl/index.d.mts.map +1 -0
- package/dist/array/impl/index.mjs +13 -0
- package/dist/array/impl/index.mjs.map +1 -0
- package/dist/array/index.d.mts +1 -1
- package/dist/array/index.d.mts.map +1 -1
- package/dist/array/index.mjs +2 -1
- package/dist/array/index.mjs.map +1 -1
- package/dist/collections/imap-mapped.d.mts +83 -254
- package/dist/collections/imap-mapped.d.mts.map +1 -1
- package/dist/collections/imap-mapped.mjs +40 -170
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.d.mts +436 -164
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +83 -101
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +828 -345
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +200 -242
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +397 -205
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs +102 -184
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.d.mts +155 -136
- package/dist/collections/queue.d.mts.map +1 -1
- package/dist/collections/queue.mjs +59 -160
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.d.mts +154 -155
- package/dist/collections/stack.d.mts.map +1 -1
- package/dist/collections/stack.mjs +58 -207
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.d.mts +2 -0
- package/dist/entry-point.d.mts.map +1 -1
- package/dist/entry-point.mjs +8 -5
- package/dist/entry-point.mjs.map +1 -1
- package/dist/expect-type.d.mts +43 -172
- package/dist/expect-type.d.mts.map +1 -1
- package/dist/expect-type.mjs +43 -172
- package/dist/expect-type.mjs.map +1 -1
- package/dist/functional/index.d.mts +2 -2
- package/dist/functional/index.d.mts.map +1 -1
- package/dist/functional/index.mjs +4 -2
- package/dist/functional/index.mjs.map +1 -1
- package/dist/functional/match.d.mts +35 -140
- package/dist/functional/match.d.mts.map +1 -1
- package/dist/functional/match.mjs.map +1 -1
- package/dist/functional/optional/impl/index.d.mts +18 -0
- package/dist/functional/optional/impl/index.d.mts.map +1 -0
- package/dist/functional/optional/impl/index.mjs +17 -0
- package/dist/functional/optional/impl/index.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-expect-to-be.d.mts +29 -0
- package/dist/functional/optional/impl/optional-expect-to-be.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-expect-to-be.mjs +25 -0
- package/dist/functional/optional/impl/optional-expect-to-be.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-filter.d.mts +29 -0
- package/dist/functional/optional/impl/optional-filter.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-filter.mjs +28 -0
- package/dist/functional/optional/impl/optional-filter.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-flat-map.d.mts +33 -0
- package/dist/functional/optional/impl/optional-flat-map.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-flat-map.mjs +21 -0
- package/dist/functional/optional/impl/optional-flat-map.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-from-nullable.d.mts +24 -0
- package/dist/functional/optional/impl/optional-from-nullable.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-from-nullable.mjs +29 -0
- package/dist/functional/optional/impl/optional-from-nullable.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-is-none.d.mts +22 -0
- package/dist/functional/optional/impl/optional-is-none.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-is-none.mjs +25 -0
- package/dist/functional/optional/impl/optional-is-none.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-is-optional.d.mts +18 -0
- package/dist/functional/optional/impl/optional-is-optional.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-is-optional.mjs +27 -0
- package/dist/functional/optional/impl/optional-is-optional.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-is-some.d.mts +22 -0
- package/dist/functional/optional/impl/optional-is-some.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-is-some.mjs +25 -0
- package/dist/functional/optional/impl/optional-is-some.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-map.d.mts +31 -0
- package/dist/functional/optional/impl/optional-map.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-map.mjs +25 -0
- package/dist/functional/optional/impl/optional-map.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-none.d.mts +16 -0
- package/dist/functional/optional/impl/optional-none.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-none.mjs +20 -0
- package/dist/functional/optional/impl/optional-none.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-or-else.d.mts +35 -0
- package/dist/functional/optional/impl/optional-or-else.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-or-else.mjs +19 -0
- package/dist/functional/optional/impl/optional-or-else.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-some.d.mts +19 -0
- package/dist/functional/optional/impl/optional-some.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-some.mjs +26 -0
- package/dist/functional/optional/impl/optional-some.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-to-nullable.d.mts +27 -0
- package/dist/functional/optional/impl/optional-to-nullable.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-to-nullable.mjs +31 -0
- package/dist/functional/optional/impl/optional-to-nullable.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap-or.d.mts +33 -0
- package/dist/functional/optional/impl/optional-unwrap-or.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap-or.mjs +19 -0
- package/dist/functional/optional/impl/optional-unwrap-or.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap-throw.d.mts +29 -0
- package/dist/functional/optional/impl/optional-unwrap-throw.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap-throw.mjs +38 -0
- package/dist/functional/optional/impl/optional-unwrap-throw.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap.d.mts +28 -0
- package/dist/functional/optional/impl/optional-unwrap.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-unwrap.mjs +11 -0
- package/dist/functional/optional/impl/optional-unwrap.mjs.map +1 -0
- package/dist/functional/optional/impl/optional-zip.d.mts +31 -0
- package/dist/functional/optional/impl/optional-zip.d.mts.map +1 -0
- package/dist/functional/optional/impl/optional-zip.mjs +39 -0
- package/dist/functional/optional/impl/optional-zip.mjs.map +1 -0
- package/dist/functional/optional/impl/tag.d.mts +5 -0
- package/dist/functional/optional/impl/tag.d.mts.map +1 -0
- package/dist/functional/optional/impl/tag.mjs +7 -0
- package/dist/functional/optional/impl/tag.mjs.map +1 -0
- package/dist/functional/optional/impl/types.d.mts +22 -0
- package/dist/functional/optional/impl/types.d.mts.map +1 -0
- package/dist/functional/optional/impl/types.mjs +2 -0
- package/dist/functional/optional/impl/types.mjs.map +1 -0
- package/dist/functional/optional/index.d.mts +2 -0
- package/dist/functional/optional/index.d.mts.map +1 -0
- package/dist/functional/optional/index.mjs +3 -0
- package/dist/functional/optional/index.mjs.map +1 -0
- package/dist/functional/pipe.d.mts +63 -117
- package/dist/functional/pipe.d.mts.map +1 -1
- package/dist/functional/pipe.mjs +4 -3
- package/dist/functional/pipe.mjs.map +1 -1
- package/dist/functional/result/impl/index.d.mts +24 -0
- package/dist/functional/result/impl/index.d.mts.map +1 -0
- package/dist/functional/result/impl/index.mjs +23 -0
- package/dist/functional/result/impl/index.mjs.map +1 -0
- package/dist/functional/result/impl/result-err.d.mts +25 -0
- package/dist/functional/result/impl/result-err.d.mts.map +1 -0
- package/dist/functional/result/impl/result-err.mjs +32 -0
- package/dist/functional/result/impl/result-err.mjs.map +1 -0
- package/dist/functional/result/impl/result-expect-to-be.d.mts +27 -0
- package/dist/functional/result/impl/result-expect-to-be.d.mts.map +1 -0
- package/dist/functional/result/impl/result-expect-to-be.mjs +26 -0
- package/dist/functional/result/impl/result-expect-to-be.mjs.map +1 -0
- package/dist/functional/result/impl/result-flat-map.d.mts +39 -0
- package/dist/functional/result/impl/result-flat-map.d.mts.map +1 -0
- package/dist/functional/result/impl/result-flat-map.mjs +24 -0
- package/dist/functional/result/impl/result-flat-map.mjs.map +1 -0
- package/dist/functional/result/impl/result-fold.d.mts +45 -0
- package/dist/functional/result/impl/result-fold.d.mts.map +1 -0
- package/dist/functional/result/impl/result-fold.mjs +26 -0
- package/dist/functional/result/impl/result-fold.mjs.map +1 -0
- package/dist/functional/result/impl/result-from-promise.d.mts +32 -0
- package/dist/functional/result/impl/result-from-promise.d.mts.map +1 -0
- package/dist/functional/result/impl/result-from-promise.mjs +32 -0
- package/dist/functional/result/impl/result-from-promise.mjs.map +1 -0
- package/dist/functional/result/impl/result-from-throwable.d.mts +29 -0
- package/dist/functional/result/impl/result-from-throwable.d.mts.map +1 -0
- package/dist/functional/result/impl/result-from-throwable.mjs +46 -0
- package/dist/functional/result/impl/result-from-throwable.mjs.map +1 -0
- package/dist/functional/result/impl/result-is-err.d.mts +20 -0
- package/dist/functional/result/impl/result-is-err.d.mts.map +1 -0
- package/dist/functional/result/impl/result-is-err.mjs +23 -0
- package/dist/functional/result/impl/result-is-err.mjs.map +1 -0
- package/dist/functional/result/impl/result-is-ok.d.mts +20 -0
- package/dist/functional/result/impl/result-is-ok.d.mts.map +1 -0
- package/dist/functional/result/impl/result-is-ok.mjs +23 -0
- package/dist/functional/result/impl/result-is-ok.mjs.map +1 -0
- package/dist/functional/result/impl/result-is-result.d.mts +17 -0
- package/dist/functional/result/impl/result-is-result.d.mts.map +1 -0
- package/dist/functional/result/impl/result-is-result.mjs +26 -0
- package/dist/functional/result/impl/result-is-result.mjs.map +1 -0
- package/dist/functional/result/impl/result-map-err.d.mts +33 -0
- package/dist/functional/result/impl/result-map-err.d.mts.map +1 -0
- package/dist/functional/result/impl/result-map-err.mjs +25 -0
- package/dist/functional/result/impl/result-map-err.mjs.map +1 -0
- package/dist/functional/result/impl/result-map.d.mts +34 -0
- package/dist/functional/result/impl/result-map.d.mts.map +1 -0
- package/dist/functional/result/impl/result-map.mjs +25 -0
- package/dist/functional/result/impl/result-map.mjs.map +1 -0
- package/dist/functional/result/impl/result-ok.d.mts +25 -0
- package/dist/functional/result/impl/result-ok.d.mts.map +1 -0
- package/dist/functional/result/impl/result-ok.mjs +32 -0
- package/dist/functional/result/impl/result-ok.mjs.map +1 -0
- package/dist/functional/result/impl/result-or-else.d.mts +32 -0
- package/dist/functional/result/impl/result-or-else.d.mts.map +1 -0
- package/dist/functional/result/impl/result-or-else.mjs +20 -0
- package/dist/functional/result/impl/result-or-else.mjs.map +1 -0
- package/dist/functional/result/impl/result-swap.d.mts +20 -0
- package/dist/functional/result/impl/result-swap.d.mts.map +1 -0
- package/dist/functional/result/impl/result-swap.mjs +28 -0
- package/dist/functional/result/impl/result-swap.mjs.map +1 -0
- package/dist/functional/result/impl/result-to-optional.d.mts +28 -0
- package/dist/functional/result/impl/result-to-optional.d.mts.map +1 -0
- package/dist/functional/result/impl/result-to-optional.mjs +34 -0
- package/dist/functional/result/impl/result-to-optional.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err-or.d.mts +29 -0
- package/dist/functional/result/impl/result-unwrap-err-or.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err-or.mjs +20 -0
- package/dist/functional/result/impl/result-unwrap-err-or.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err-throw.d.mts +30 -0
- package/dist/functional/result/impl/result-unwrap-err-throw.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err-throw.mjs +47 -0
- package/dist/functional/result/impl/result-unwrap-err-throw.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err.d.mts +31 -0
- package/dist/functional/result/impl/result-unwrap-err.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-err.mjs +36 -0
- package/dist/functional/result/impl/result-unwrap-err.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-ok-or.d.mts +29 -0
- package/dist/functional/result/impl/result-unwrap-ok-or.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-ok-or.mjs +20 -0
- package/dist/functional/result/impl/result-unwrap-ok-or.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-ok.d.mts +23 -0
- package/dist/functional/result/impl/result-unwrap-ok.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-ok.mjs +11 -0
- package/dist/functional/result/impl/result-unwrap-ok.mjs.map +1 -0
- package/dist/functional/result/impl/result-unwrap-throw.d.mts +30 -0
- package/dist/functional/result/impl/result-unwrap-throw.d.mts.map +1 -0
- package/dist/functional/result/impl/result-unwrap-throw.mjs +41 -0
- package/dist/functional/result/impl/result-unwrap-throw.mjs.map +1 -0
- package/dist/functional/result/impl/result-zip.d.mts +29 -0
- package/dist/functional/result/impl/result-zip.d.mts.map +1 -0
- package/dist/functional/result/impl/result-zip.mjs +38 -0
- package/dist/functional/result/impl/result-zip.mjs.map +1 -0
- package/dist/functional/result/impl/tag.d.mts +5 -0
- package/dist/functional/result/impl/tag.d.mts.map +1 -0
- package/dist/functional/result/impl/tag.mjs +7 -0
- package/dist/functional/result/impl/tag.mjs.map +1 -0
- package/dist/functional/result/impl/types.d.mts +29 -0
- package/dist/functional/result/impl/types.d.mts.map +1 -0
- package/dist/functional/result/impl/types.mjs +2 -0
- package/dist/functional/result/impl/types.mjs.map +1 -0
- package/dist/functional/result/index.d.mts +2 -0
- package/dist/functional/result/index.d.mts.map +1 -0
- package/dist/functional/result/index.mjs +3 -0
- package/dist/functional/result/index.mjs.map +1 -0
- package/dist/globals.d.mts +95 -5
- package/dist/guard/has-key.d.mts +23 -74
- package/dist/guard/has-key.d.mts.map +1 -1
- package/dist/guard/has-key.mjs +23 -74
- package/dist/guard/has-key.mjs.map +1 -1
- package/dist/guard/is-non-empty-string.d.mts +20 -87
- package/dist/guard/is-non-empty-string.d.mts.map +1 -1
- package/dist/guard/is-non-empty-string.mjs +20 -87
- package/dist/guard/is-non-empty-string.mjs.map +1 -1
- package/dist/guard/is-non-null-object.d.mts +14 -84
- package/dist/guard/is-non-null-object.d.mts.map +1 -1
- package/dist/guard/is-non-null-object.mjs +14 -84
- package/dist/guard/is-non-null-object.mjs.map +1 -1
- package/dist/guard/is-primitive.d.mts +13 -126
- package/dist/guard/is-primitive.d.mts.map +1 -1
- package/dist/guard/is-primitive.mjs +13 -126
- package/dist/guard/is-primitive.mjs.map +1 -1
- package/dist/guard/is-record.d.mts +21 -132
- package/dist/guard/is-record.d.mts.map +1 -1
- package/dist/guard/is-record.mjs +21 -132
- package/dist/guard/is-record.mjs.map +1 -1
- package/dist/guard/is-type.d.mts +201 -238
- package/dist/guard/is-type.d.mts.map +1 -1
- package/dist/guard/is-type.mjs +201 -238
- package/dist/guard/is-type.mjs.map +1 -1
- package/dist/guard/key-is-in.d.mts +22 -139
- package/dist/guard/key-is-in.d.mts.map +1 -1
- package/dist/guard/key-is-in.mjs +22 -139
- package/dist/guard/key-is-in.mjs.map +1 -1
- package/dist/index.d.mts +0 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -5
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/range.d.mts +29 -62
- package/dist/iterator/range.d.mts.map +1 -1
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.d.mts +191 -122
- package/dist/json/json.d.mts.map +1 -1
- package/dist/json/json.mjs +246 -144
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +24 -156
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +28 -160
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +122 -120
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int.mjs +123 -121
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.d.mts +22 -30
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int16.mjs +23 -31
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.d.mts +22 -31
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/int32.mjs +23 -32
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +28 -36
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +32 -40
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +24 -34
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +25 -35
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +26 -35
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +27 -36
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +22 -37
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +26 -41
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +15 -30
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +16 -31
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +27 -35
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +28 -36
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +29 -36
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +30 -37
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +37 -38
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +40 -41
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +25 -36
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +25 -36
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +26 -40
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +30 -44
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +133 -123
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +134 -124
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +24 -35
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +25 -36
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +24 -35
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +25 -36
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +159 -33
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +161 -35
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +24 -35
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +25 -36
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +26 -36
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +27 -37
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +140 -99
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +143 -102
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +24 -33
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +26 -35
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.d.mts +121 -30
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.mjs +122 -31
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +26 -34
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.mjs +27 -35
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +26 -68
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.mjs +27 -69
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/int8.d.mts +37 -101
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/int8.mjs +40 -171
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.d.mts +45 -55
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/enum/uint8.mjs +47 -156
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/num.d.mts +145 -206
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/num.mjs +143 -199
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +97 -21
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +91 -22
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.d.mts +126 -208
- package/dist/object/object.d.mts.map +1 -1
- package/dist/object/object.mjs +68 -102
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/cast-mutable.d.mts +12 -88
- package/dist/others/cast-mutable.d.mts.map +1 -1
- package/dist/others/cast-mutable.mjs +13 -89
- package/dist/others/cast-mutable.mjs.map +1 -1
- package/dist/others/cast-readonly.d.mts +12 -168
- package/dist/others/cast-readonly.d.mts.map +1 -1
- package/dist/others/cast-readonly.mjs +13 -169
- package/dist/others/cast-readonly.mjs.map +1 -1
- package/dist/others/if-then.d.mts +6 -83
- package/dist/others/if-then.d.mts.map +1 -1
- package/dist/others/if-then.mjs +6 -83
- package/dist/others/if-then.mjs.map +1 -1
- package/dist/others/map-nullable.d.mts +12 -136
- package/dist/others/map-nullable.d.mts.map +1 -1
- package/dist/others/map-nullable.mjs.map +1 -1
- package/dist/others/memoize-function.d.mts +14 -157
- package/dist/others/memoize-function.d.mts.map +1 -1
- package/dist/others/memoize-function.mjs +14 -157
- package/dist/others/memoize-function.mjs.map +1 -1
- package/dist/others/tuple.d.mts +33 -151
- package/dist/others/tuple.d.mts.map +1 -1
- package/dist/others/tuple.mjs +33 -151
- package/dist/others/tuple.mjs.map +1 -1
- package/dist/others/unknown-to-string.d.mts +11 -125
- package/dist/others/unknown-to-string.d.mts.map +1 -1
- package/dist/others/unknown-to-string.mjs +12 -126
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/dist/promise/promise.d.mts +33 -21
- package/dist/promise/promise.d.mts.map +1 -1
- package/dist/promise/promise.mjs +36 -24
- package/dist/promise/promise.mjs.map +1 -1
- package/package.json +58 -44
- package/src/array/impl/array-utils-creation.mts +192 -0
- package/src/array/{array-utils-creation.test.mts → impl/array-utils-creation.test.mts} +121 -72
- package/src/array/impl/array-utils-element-access.mts +115 -0
- package/src/array/impl/array-utils-element-access.test.mts +151 -0
- package/src/array/impl/array-utils-iterators.mts +79 -0
- package/src/array/impl/array-utils-iterators.test.mts +98 -0
- package/src/array/impl/array-utils-modification.mts +434 -0
- package/src/array/{array-utils-modification.test.mts → impl/array-utils-modification.test.mts} +41 -28
- package/src/array/{array-utils-overload-type-error.test.mts → impl/array-utils-overload-type-error.test.mts} +33 -33
- package/src/array/impl/array-utils-reducing-value.mts +535 -0
- package/src/array/{array-utils-reducing-value.test.mts → impl/array-utils-reducing-value.test.mts} +53 -58
- package/src/array/impl/array-utils-search.mts +509 -0
- package/src/array/impl/array-utils-search.test.mts +346 -0
- package/src/array/impl/array-utils-set-op.mts +166 -0
- package/src/array/{array-utils-set-op.test.mts → impl/array-utils-set-op.test.mts} +42 -35
- package/src/array/impl/array-utils-size.mts +30 -0
- package/src/array/impl/array-utils-size.test.mts +9 -0
- package/src/array/impl/array-utils-slice-clamped.mts +51 -0
- package/src/array/{array-utils-slice-clamped.test.mts → impl/array-utils-slice-clamped.test.mts} +13 -13
- package/src/array/impl/array-utils-slicing.mts +275 -0
- package/src/array/impl/array-utils-slicing.test.mts +158 -0
- package/src/array/impl/array-utils-transformation.mts +746 -0
- package/src/array/{array-utils-transformation.test.mts → impl/array-utils-transformation.test.mts} +662 -889
- package/src/array/impl/array-utils-validation.mts +241 -0
- package/src/array/{array-utils-validation.test.mts → impl/array-utils-validation.test.mts} +194 -107
- package/src/array/{array.test.mts → impl/array.test.mts} +2 -2
- package/src/array/impl/index.mts +12 -0
- package/src/array/index.mts +1 -1
- package/src/collections/imap-mapped.mts +99 -265
- package/src/collections/imap.mts +477 -174
- package/src/collections/imap.test.mts +12 -19
- package/src/collections/iset-mapped.mts +892 -358
- package/src/collections/iset.mts +429 -213
- package/src/collections/queue.mts +174 -200
- package/src/collections/stack.mts +172 -245
- package/src/collections/stack.test.mts +9 -1
- package/src/entry-point.mts +2 -0
- package/src/expect-type.mts +43 -172
- package/src/functional/index.mts +2 -2
- package/src/functional/match.mts +35 -145
- package/src/functional/optional/impl/index.mts +17 -0
- package/src/functional/optional/impl/optional-expect-to-be.mts +65 -0
- package/src/functional/optional/impl/optional-filter.mts +71 -0
- package/src/functional/optional/impl/optional-flat-map.mts +67 -0
- package/src/functional/optional/impl/optional-from-nullable.mts +28 -0
- package/src/functional/optional/impl/optional-is-none.mts +25 -0
- package/src/functional/optional/impl/optional-is-optional.mts +27 -0
- package/src/functional/optional/impl/optional-is-some.mts +25 -0
- package/src/functional/optional/impl/optional-map.mts +69 -0
- package/src/functional/optional/impl/optional-none.mts +17 -0
- package/src/functional/optional/impl/optional-or-else.mts +73 -0
- package/src/functional/optional/impl/optional-some.mts +23 -0
- package/src/functional/optional/impl/optional-to-nullable.mts +31 -0
- package/src/functional/optional/impl/optional-unwrap-or.mts +64 -0
- package/src/functional/optional/impl/optional-unwrap-throw.mts +39 -0
- package/src/functional/optional/impl/optional-unwrap.mts +41 -0
- package/src/functional/optional/impl/optional-zip.mts +40 -0
- package/src/functional/optional/impl/tag.mts +6 -0
- package/src/functional/optional/impl/types.mts +28 -0
- package/src/functional/optional/index.mts +1 -0
- package/src/functional/optional.test.mts +11 -9
- package/src/functional/pipe.mts +65 -118
- package/src/functional/pipe.test.mts +1 -1
- package/src/functional/result/impl/index.mts +23 -0
- package/src/functional/result/impl/result-err.mts +29 -0
- package/src/functional/result/impl/result-expect-to-be.mts +63 -0
- package/src/functional/result/impl/result-flat-map.mts +79 -0
- package/src/functional/result/impl/result-fold.mts +95 -0
- package/src/functional/result/impl/result-from-promise.mts +39 -0
- package/src/functional/result/impl/result-from-throwable.mts +42 -0
- package/src/functional/result/impl/result-is-err.mts +23 -0
- package/src/functional/result/impl/result-is-ok.mts +23 -0
- package/src/functional/result/impl/result-is-result.mts +23 -0
- package/src/functional/result/impl/result-map-err.mts +72 -0
- package/src/functional/result/impl/result-map.mts +73 -0
- package/src/functional/result/impl/result-ok.mts +29 -0
- package/src/functional/result/impl/result-or-else.mts +63 -0
- package/src/functional/result/impl/result-swap.mts +28 -0
- package/src/functional/result/impl/result-to-optional.mts +34 -0
- package/src/functional/result/impl/result-unwrap-err-or.mts +60 -0
- package/src/functional/result/impl/result-unwrap-err-throw.mts +53 -0
- package/src/functional/result/impl/result-unwrap-err.mts +36 -0
- package/src/functional/result/impl/result-unwrap-ok-or.mts +60 -0
- package/src/functional/result/impl/result-unwrap-ok.mts +35 -0
- package/src/functional/result/impl/result-unwrap-throw.mts +43 -0
- package/src/functional/result/impl/result-zip.mts +39 -0
- package/src/functional/result/impl/tag.mts +6 -0
- package/src/functional/result/impl/types.mts +35 -0
- package/src/functional/result/index.mts +1 -0
- package/src/functional/result.test.mts +14 -6
- package/src/globals.d.mts +95 -5
- package/src/guard/has-key.mts +23 -74
- package/src/guard/is-non-empty-string.mts +20 -87
- package/src/guard/is-non-empty-string.test.mts +1 -1
- package/src/guard/is-non-null-object.mts +14 -84
- package/src/guard/is-non-null-object.test.mts +4 -4
- package/src/guard/is-primitive.mts +13 -126
- package/src/guard/is-primitive.test.mts +4 -4
- package/src/guard/is-record.mts +21 -132
- package/src/guard/is-type.mts +201 -238
- package/src/guard/is-type.test.mts +10 -10
- package/src/guard/key-is-in.mts +22 -139
- package/src/index.mts +0 -2
- package/src/iterator/range.mts +29 -62
- package/src/json/json.mts +202 -134
- package/src/json/json.test.mts +1 -3
- package/src/number/branded-types/finite-number.mts +34 -166
- package/src/number/branded-types/int.mts +129 -127
- package/src/number/branded-types/int16.mts +31 -39
- package/src/number/branded-types/int16.test.mts +24 -24
- package/src/number/branded-types/int32.mts +31 -40
- package/src/number/branded-types/int32.test.mts +39 -39
- package/src/number/branded-types/non-negative-finite-number.mts +39 -47
- package/src/number/branded-types/non-negative-int16.mts +33 -43
- package/src/number/branded-types/non-negative-int16.test.mts +16 -16
- package/src/number/branded-types/non-negative-int32.mts +35 -44
- package/src/number/branded-types/non-negative-int32.test.mts +30 -30
- package/src/number/branded-types/non-zero-finite-number.mts +32 -47
- package/src/number/branded-types/non-zero-int.mts +22 -37
- package/src/number/branded-types/non-zero-int16.mts +36 -44
- package/src/number/branded-types/non-zero-int16.test.mts +26 -26
- package/src/number/branded-types/non-zero-int32.mts +38 -45
- package/src/number/branded-types/non-zero-int32.test.mts +45 -42
- package/src/number/branded-types/non-zero-safe-int.mts +48 -49
- package/src/number/branded-types/non-zero-uint16.mts +33 -44
- package/src/number/branded-types/non-zero-uint16.test.mts +16 -16
- package/src/number/branded-types/non-zero-uint32.mts +33 -44
- package/src/number/branded-types/non-zero-uint32.test.mts +28 -28
- package/src/number/branded-types/positive-finite-number.mts +37 -51
- package/src/number/branded-types/positive-int.mts +142 -132
- package/src/number/branded-types/positive-int16.mts +33 -44
- package/src/number/branded-types/positive-int16.test.mts +14 -14
- package/src/number/branded-types/positive-int32.mts +33 -44
- package/src/number/branded-types/positive-int32.test.mts +26 -26
- package/src/number/branded-types/positive-safe-int.mts +169 -43
- package/src/number/branded-types/positive-uint16.mts +33 -44
- package/src/number/branded-types/positive-uint16.test.mts +16 -16
- package/src/number/branded-types/positive-uint32.mts +35 -45
- package/src/number/branded-types/positive-uint32.test.mts +31 -28
- package/src/number/branded-types/safe-int.mts +151 -110
- package/src/number/branded-types/safe-uint.mts +34 -43
- package/src/number/branded-types/uint.mts +129 -38
- package/src/number/branded-types/uint16.mts +35 -43
- package/src/number/branded-types/uint16.test.mts +16 -16
- package/src/number/branded-types/uint32.mts +35 -77
- package/src/number/branded-types/uint32.test.mts +28 -28
- package/src/number/enum/int8.mts +42 -173
- package/src/number/enum/int8.test.mts +9 -9
- package/src/number/enum/uint8.mts +49 -158
- package/src/number/enum/uint8.test.mts +8 -8
- package/src/number/num.mts +157 -212
- package/src/number/num.test.mts +4 -4
- package/src/number/refined-number-utils.mts +109 -26
- package/src/object/object.mts +130 -212
- package/src/object/object.test.mts +29 -0
- package/src/others/cast-mutable.mts +13 -89
- package/src/others/cast-mutable.test.mts +80 -0
- package/src/others/cast-readonly.mts +13 -169
- package/src/others/if-then.mts +6 -83
- package/src/others/map-nullable.mts +12 -136
- package/src/others/map-nullable.test.mts +6 -6
- package/src/others/memoize-function.mts +14 -157
- package/src/others/tuple.mts +33 -151
- package/src/others/unknown-to-string.mts +12 -126
- package/src/others/unknown-to-string.test.mts +13 -1
- package/src/promise/promise.mts +34 -21
- package/src/promise/promise.test.mts +43 -0
- package/dist/array/array-utils.d.mts +0 -2956
- package/dist/array/array-utils.d.mts.map +0 -1
- package/dist/array/array-utils.mjs +0 -1838
- package/dist/array/array-utils.mjs.map +0 -1
- package/dist/functional/optional.d.mts +0 -360
- package/dist/functional/optional.d.mts.map +0 -1
- package/dist/functional/optional.mjs +0 -268
- package/dist/functional/optional.mjs.map +0 -1
- package/dist/functional/result.d.mts +0 -611
- package/dist/functional/result.d.mts.map +0 -1
- package/dist/functional/result.mjs +0 -545
- package/dist/functional/result.mjs.map +0 -1
- package/src/array/array-utils-search.test.mts +0 -169
- package/src/array/array-utils-slicing.test.mts +0 -274
- package/src/array/array-utils.mts +0 -4834
- package/src/functional/optional.mts +0 -591
- package/src/functional/result.mts +0 -986
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { none } from './optional-none.mjs';
|
|
3
|
+
import { unwrap } from './optional-unwrap.mjs';
|
|
4
|
+
import { type Unwrap } from './types.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Applies a function that returns an `Optional` to the value in an
|
|
8
|
+
* `Some`. If the input is `None`, returns `None`.
|
|
9
|
+
* This is the monadic bind operation for `Optional`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const parseNumber = (input: string): Optional<number> => {
|
|
15
|
+
* const num = Number.parseInt(input, 10);
|
|
16
|
+
* return Number.isNaN(num) ? Optional.none : Optional.some(num);
|
|
17
|
+
* };
|
|
18
|
+
*
|
|
19
|
+
* const parsed = Optional.flatMap(Optional.some('10'), parseNumber);
|
|
20
|
+
*
|
|
21
|
+
* assert.deepStrictEqual(parsed, Optional.some(10));
|
|
22
|
+
*
|
|
23
|
+
* const flatMapParse = Optional.flatMap(parseNumber);
|
|
24
|
+
*
|
|
25
|
+
* assert.deepStrictEqual(flatMapParse(Optional.some('5')), Optional.some(5));
|
|
26
|
+
* assert.deepStrictEqual(flatMapParse(Optional.some('invalid')), Optional.none);
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @template O The input `UnknownOptional` type.
|
|
30
|
+
* @template S2 The value type of the `Optional` returned by the function.
|
|
31
|
+
* @param optional The `Optional` to flat map.
|
|
32
|
+
* @param flatMapFn The function to apply that returns an `Optional`.
|
|
33
|
+
* @returns The result of applying the function, or `None`.
|
|
34
|
+
*/
|
|
35
|
+
export function flatMap<O extends UnknownOptional, S2>(
|
|
36
|
+
optional: O,
|
|
37
|
+
flatMapFn: (value: Unwrap<O>) => Optional<S2>,
|
|
38
|
+
): Optional<S2>;
|
|
39
|
+
|
|
40
|
+
// Curried version
|
|
41
|
+
export function flatMap<S, S2>(
|
|
42
|
+
flatMapFn: (value: S) => Optional<S2>,
|
|
43
|
+
): (optional: Optional<S>) => Optional<S2>;
|
|
44
|
+
|
|
45
|
+
export function flatMap<O extends UnknownOptional, S2>(
|
|
46
|
+
...args:
|
|
47
|
+
| readonly [optional: O, flatMapFn: (value: Unwrap<O>) => Optional<S2>]
|
|
48
|
+
| readonly [flatMapFn: (value: Unwrap<O>) => Optional<S2>]
|
|
49
|
+
): Optional<S2> | ((optional: O) => Optional<S2>) {
|
|
50
|
+
switch (args.length) {
|
|
51
|
+
case 2: {
|
|
52
|
+
const [optional, flatMapFn] = args;
|
|
53
|
+
return flatMapImpl(optional, flatMapFn);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
case 1: {
|
|
57
|
+
// Curried version
|
|
58
|
+
const [flatMapFn] = args;
|
|
59
|
+
return (optional: O) => flatMapImpl(optional, flatMapFn);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const flatMapImpl = <O extends UnknownOptional, S2>(
|
|
65
|
+
optional: O,
|
|
66
|
+
flatMapFn: (value: Unwrap<O>) => Optional<S2>,
|
|
67
|
+
): Optional<S2> => (isSome(optional) ? flatMapFn(unwrap(optional)) : none);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { none } from './optional-none.mjs';
|
|
2
|
+
import { some } from './optional-some.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Converts a nullable value to an `Optional`.
|
|
6
|
+
*
|
|
7
|
+
* This is the primary way to lift nullable values (null or undefined) into
|
|
8
|
+
* the Optional type system. The function treats both `null` and `undefined`
|
|
9
|
+
* as empty values, converting them to `None`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const present = Optional.fromNullable('hello');
|
|
15
|
+
* const absent = Optional.fromNullable<string | null>(null);
|
|
16
|
+
*
|
|
17
|
+
* assert.deepStrictEqual(present, Optional.some('hello'));
|
|
18
|
+
* assert.deepStrictEqual(absent, Optional.none);
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @template T The type of the nullable value.
|
|
22
|
+
* @param value The nullable value to convert.
|
|
23
|
+
* @returns `Some<NonNullable<T>>` if the value is not null or
|
|
24
|
+
* undefined, otherwise `None`.
|
|
25
|
+
*/
|
|
26
|
+
export const fromNullable = <T,>(
|
|
27
|
+
value: T | null | undefined,
|
|
28
|
+
): Optional<NonNullable<T>> => (value == null ? none : some(value));
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NoneTypeTagName } from './tag.mjs';
|
|
2
|
+
import { type NarrowToNone } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Checks if an {@link Optional} is {@link None}. Acts as a type guard.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const optionalValue = Optional.none as Optional<number>;
|
|
11
|
+
*
|
|
12
|
+
* if (Optional.isNone(optionalValue)) {
|
|
13
|
+
* // Type narrowed to None
|
|
14
|
+
* assert.ok(true); // optionalValue is None
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @template O The {@link UnknownOptional} type to check.
|
|
19
|
+
* @param optional The {@link Optional} to check.
|
|
20
|
+
* @returns `true` if the {@link Optional} is {@link None}, `false`
|
|
21
|
+
* otherwise.
|
|
22
|
+
*/
|
|
23
|
+
export const isNone = <O extends UnknownOptional>(
|
|
24
|
+
optional: O,
|
|
25
|
+
): optional is NarrowToNone<O> => optional.$$tag === NoneTypeTagName;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { isRecord } from '../../../guard/index.mjs';
|
|
2
|
+
import { NoneTypeTagName, SomeTypeTagName } from './tag.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Checks if the given value is an {@link Optional}.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const maybeOptional = Optional.some('value');
|
|
11
|
+
* const notOptional = { $$tag: 'ts-data-forge::Optional.some' };
|
|
12
|
+
*
|
|
13
|
+
* assert.ok(Optional.isOptional(maybeOptional));
|
|
14
|
+
* assert.notOk(Optional.isOptional(notOptional));
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @param maybeOptional The value to check.
|
|
18
|
+
* @returns `true` if the value is an {@link Optional}, otherwise `false`.
|
|
19
|
+
*/
|
|
20
|
+
export const isOptional = (
|
|
21
|
+
maybeOptional: unknown,
|
|
22
|
+
): maybeOptional is Optional<unknown> =>
|
|
23
|
+
isRecord(maybeOptional) &&
|
|
24
|
+
Object.hasOwn(maybeOptional, '$$tag') &&
|
|
25
|
+
((maybeOptional['$$tag'] === SomeTypeTagName &&
|
|
26
|
+
Object.hasOwn(maybeOptional, 'value')) ||
|
|
27
|
+
maybeOptional['$$tag'] === NoneTypeTagName);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SomeTypeTagName } from './tag.mjs';
|
|
2
|
+
import { type NarrowToSome } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Checks if an {@link Optional} is {@link Some}. Acts as a type guard.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const optionalNumber = Optional.some(42);
|
|
11
|
+
*
|
|
12
|
+
* if (Optional.isSome(optionalNumber)) {
|
|
13
|
+
* const value: number = optionalNumber.value;
|
|
14
|
+
* assert(value === 42);
|
|
15
|
+
* }
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* @template O The {@link UnknownOptional} type to check.
|
|
19
|
+
* @param optional The {@link Optional} to check.
|
|
20
|
+
* @returns `true` if the {@link Optional} is {@link Some}, `false`
|
|
21
|
+
* otherwise.
|
|
22
|
+
*/
|
|
23
|
+
export const isSome = <O extends UnknownOptional>(
|
|
24
|
+
optional: O,
|
|
25
|
+
): optional is NarrowToSome<O> => optional.$$tag === SomeTypeTagName;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { none } from './optional-none.mjs';
|
|
3
|
+
import { some } from './optional-some.mjs';
|
|
4
|
+
import { unwrap } from './optional-unwrap.mjs';
|
|
5
|
+
import { type Unwrap } from './types.mjs';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Maps an {@link Optional}<S> to {@link Optional}<S2> by applying a function to
|
|
9
|
+
* a contained value. If the {@link Optional} is {@link None}, it
|
|
10
|
+
* returns {@link Optional.none}. Otherwise, it applies the `mapFn` to the
|
|
11
|
+
* value in `Some` and returns a new `Some` with the result.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* const numberOptional = Optional.some(21);
|
|
17
|
+
* const mapped = Optional.map(numberOptional, (value) => value * 2);
|
|
18
|
+
*
|
|
19
|
+
* assert.deepStrictEqual(mapped, Optional.some(42));
|
|
20
|
+
*
|
|
21
|
+
* const mapToLength = Optional.map((text: string) => text.length);
|
|
22
|
+
*
|
|
23
|
+
* assert.deepStrictEqual(mapToLength(Optional.some('abc')), Optional.some(3));
|
|
24
|
+
* assert.deepStrictEqual(mapToLength(Optional.none), Optional.none);
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @template O The input `UnknownOptional` type.
|
|
28
|
+
* @template S2 The type of the value returned by the mapping function.
|
|
29
|
+
* @param optional The `Optional` to map.
|
|
30
|
+
* @param mapFn The function to apply to the value if it exists.
|
|
31
|
+
* @returns A new `Optional<S2>` resulting from the mapping, or
|
|
32
|
+
* `None` if the input was `None`.
|
|
33
|
+
*/
|
|
34
|
+
export function map<O extends UnknownOptional, S2>(
|
|
35
|
+
optional: O,
|
|
36
|
+
mapFn: (value: Unwrap<O>) => S2,
|
|
37
|
+
): Optional<S2>;
|
|
38
|
+
|
|
39
|
+
// Curried version
|
|
40
|
+
export function map<S, S2>(
|
|
41
|
+
mapFn: (value: S) => S2,
|
|
42
|
+
): (optional: Optional<S>) => Optional<S2>;
|
|
43
|
+
|
|
44
|
+
export function map<O extends UnknownOptional, S2>(
|
|
45
|
+
...args:
|
|
46
|
+
| readonly [optional: O, mapFn: (value: Unwrap<O>) => S2]
|
|
47
|
+
| readonly [mapFn: (value: Unwrap<O>) => S2]
|
|
48
|
+
): Optional<S2> | ((optional: O) => Optional<S2>) {
|
|
49
|
+
switch (args.length) {
|
|
50
|
+
case 2: {
|
|
51
|
+
const [optional, mapFn] = args;
|
|
52
|
+
return mapImpl(optional, mapFn);
|
|
53
|
+
}
|
|
54
|
+
case 1: {
|
|
55
|
+
// Curried version: first argument is mapping function
|
|
56
|
+
const [mapFn] = args;
|
|
57
|
+
return (optional: O) => mapImpl(optional, mapFn);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const mapImpl = <O extends UnknownOptional, S2>(
|
|
63
|
+
optional: O,
|
|
64
|
+
mapFn: (value: Unwrap<O>) => S2,
|
|
65
|
+
): Optional<S2> =>
|
|
66
|
+
isSome(optional)
|
|
67
|
+
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
68
|
+
some(mapFn(unwrap(optional)!))
|
|
69
|
+
: none;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NoneTypeTagName } from './tag.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The singleton instance representing {@link None} (an empty
|
|
5
|
+
* Optional).
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* const someValue = Optional.some({ id: 1 });
|
|
11
|
+
* const noneValue = Optional.none;
|
|
12
|
+
*
|
|
13
|
+
* assert.ok(Optional.isSome(someValue));
|
|
14
|
+
* assert.ok(Optional.isNone(noneValue));
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export const none: None = { $$tag: NoneTypeTagName } as const;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { isNone } from './optional-is-none.mjs';
|
|
2
|
+
import { type Unwrap } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Returns the `Optional` if it is `Some`, otherwise returns the alternative.
|
|
6
|
+
*
|
|
7
|
+
* Provides a way to chain Optional operations with fallback values. This is
|
|
8
|
+
* particularly useful for implementing default behavior or cascading lookups.
|
|
9
|
+
* Supports both direct usage and curried form for functional composition.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const preferred = Optional.some('primary');
|
|
15
|
+
* const fallback = Optional.some('secondary');
|
|
16
|
+
* const noneValue = Optional.none as Optional<string>;
|
|
17
|
+
*
|
|
18
|
+
* assert.deepStrictEqual(Optional.orElse(preferred, fallback), preferred);
|
|
19
|
+
* assert.deepStrictEqual(Optional.orElse(noneValue, fallback), fallback);
|
|
20
|
+
*
|
|
21
|
+
* const orElseFallback = Optional.orElse(Optional.some('default'));
|
|
22
|
+
*
|
|
23
|
+
* assert.deepStrictEqual(orElseFallback(Optional.none), Optional.some('default'));
|
|
24
|
+
* assert.deepStrictEqual(
|
|
25
|
+
* orElseFallback(Optional.some('value')),
|
|
26
|
+
* Optional.some('value'),
|
|
27
|
+
* );
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @template O The input `UnknownOptional` type.
|
|
31
|
+
* @param optional The `Optional` to check.
|
|
32
|
+
* @param alternative The alternative `Optional` to return if the first is
|
|
33
|
+
* `None`.
|
|
34
|
+
* @returns The first `Optional` if `Some`, otherwise the alternative.
|
|
35
|
+
*/
|
|
36
|
+
export function orElse<
|
|
37
|
+
O extends UnknownOptional,
|
|
38
|
+
const O2 extends UnknownOptional,
|
|
39
|
+
>(optional: O, alternative: O2): O | O2;
|
|
40
|
+
|
|
41
|
+
// Curried version
|
|
42
|
+
export function orElse<S, S2>(
|
|
43
|
+
alternative: Optional<S2>,
|
|
44
|
+
): (optional: Optional<S>) => Optional<S> | Optional<S2>;
|
|
45
|
+
|
|
46
|
+
export function orElse<
|
|
47
|
+
O extends UnknownOptional,
|
|
48
|
+
const O2 extends UnknownOptional,
|
|
49
|
+
>(
|
|
50
|
+
...args: readonly [optional: O, alternative: O2] | readonly [alternative: O2]
|
|
51
|
+
): (O | O2) | ((optional: Optional<Unwrap<O>>) => Optional<Unwrap<O>> | O2) {
|
|
52
|
+
switch (args.length) {
|
|
53
|
+
case 2: {
|
|
54
|
+
const [optional, alternative] = args;
|
|
55
|
+
return orElseImpl(optional, alternative);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
case 1: {
|
|
59
|
+
// Curried version
|
|
60
|
+
const [alternative] = args;
|
|
61
|
+
return (optional: Optional<Unwrap<O>>) =>
|
|
62
|
+
orElseImpl(optional, alternative);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const orElseImpl = <
|
|
68
|
+
O extends UnknownOptional,
|
|
69
|
+
const O2 extends UnknownOptional,
|
|
70
|
+
>(
|
|
71
|
+
optional: O,
|
|
72
|
+
alternative: O2,
|
|
73
|
+
): O | O2 => (isNone(optional) ? alternative : optional);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SomeTypeTagName } from './tag.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates an {@link Some} containing the given value.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const someValue = Optional.some({ id: 1 });
|
|
10
|
+
* const noneValue = Optional.none;
|
|
11
|
+
*
|
|
12
|
+
* assert.ok(Optional.isSome(someValue));
|
|
13
|
+
* assert.ok(Optional.isNone(noneValue));
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @template S The type of the value.
|
|
17
|
+
* @param value The value to wrap in an {@link Some}.
|
|
18
|
+
* @returns An {@link Some}<S> containing the value.
|
|
19
|
+
*/
|
|
20
|
+
export const some = <S,>(value: S): Some<S> => ({
|
|
21
|
+
$$tag: SomeTypeTagName,
|
|
22
|
+
value,
|
|
23
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { unwrap } from './optional-unwrap.mjs';
|
|
3
|
+
import { type Unwrap } from './types.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Converts an `Optional` to a nullable value.
|
|
7
|
+
*
|
|
8
|
+
* This function extracts the value from an Optional, returning `undefined`
|
|
9
|
+
* for empty Optionals. This is useful when interfacing with APIs or systems
|
|
10
|
+
* that expect nullable values rather than Optional types.
|
|
11
|
+
*
|
|
12
|
+
* Note: This returns `undefined` (not `null`) for consistency with
|
|
13
|
+
* JavaScript's undefined semantics and TypeScript's optional properties.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* const someNumber = Optional.some(42);
|
|
19
|
+
* const noneNumber = Optional.none as Optional<number>;
|
|
20
|
+
*
|
|
21
|
+
* assert(Optional.toNullable(someNumber) === 42);
|
|
22
|
+
* assert(Optional.toNullable(noneNumber) === undefined);
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @template O The `UnknownOptional` type to convert.
|
|
26
|
+
* @param optional The `Optional` to convert.
|
|
27
|
+
* @returns The contained value if `Some`, otherwise `undefined`.
|
|
28
|
+
*/
|
|
29
|
+
export const toNullable = <O extends UnknownOptional>(
|
|
30
|
+
optional: O,
|
|
31
|
+
): Unwrap<O> | undefined => (isSome(optional) ? unwrap(optional) : undefined);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { unwrap } from './optional-unwrap.mjs';
|
|
2
|
+
import { type Unwrap } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Unwraps an `Optional`, returning the contained value or a default value if
|
|
6
|
+
* it's `None`.
|
|
7
|
+
*
|
|
8
|
+
* Supports both direct usage and curried form for functional composition.
|
|
9
|
+
* This is often preferred over `unwrap()` when you have a sensible fallback
|
|
10
|
+
* value.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const withValue = Optional.some(5);
|
|
16
|
+
* const withoutValue = Optional.none as Optional<number>;
|
|
17
|
+
*
|
|
18
|
+
* assert(Optional.unwrapOr(withValue, 0) === 5);
|
|
19
|
+
* assert(Optional.unwrapOr(withoutValue, 0) === 0);
|
|
20
|
+
*
|
|
21
|
+
* const unwrapWithDefault = Optional.unwrapOr(10);
|
|
22
|
+
*
|
|
23
|
+
* assert(unwrapWithDefault(Optional.some(3)) === 3);
|
|
24
|
+
* assert(unwrapWithDefault(Optional.none) === 10);
|
|
25
|
+
* ```
|
|
26
|
+
*
|
|
27
|
+
* @template O The `UnknownOptional` type to unwrap.
|
|
28
|
+
* @template D The type of the default value.
|
|
29
|
+
* @param optional The `Optional` to unwrap.
|
|
30
|
+
* @param defaultValue The value to return if `optional` is `None`.
|
|
31
|
+
* @returns The contained value if `Some`, otherwise `defaultValue`.
|
|
32
|
+
*/
|
|
33
|
+
export function unwrapOr<O extends UnknownOptional, D>(
|
|
34
|
+
optional: O,
|
|
35
|
+
defaultValue: D,
|
|
36
|
+
): D | Unwrap<O>;
|
|
37
|
+
|
|
38
|
+
// Curried version
|
|
39
|
+
export function unwrapOr<S, D>(
|
|
40
|
+
defaultValue: D,
|
|
41
|
+
): (optional: Optional<S>) => D | S;
|
|
42
|
+
|
|
43
|
+
export function unwrapOr<O extends UnknownOptional, D>(
|
|
44
|
+
...args: readonly [optional: O, defaultValue: D] | readonly [defaultValue: D]
|
|
45
|
+
): (D | Unwrap<O>) | ((optional: Optional<Unwrap<O>>) => D | Unwrap<O>) {
|
|
46
|
+
switch (args.length) {
|
|
47
|
+
case 2: {
|
|
48
|
+
const [optional, defaultValue] = args;
|
|
49
|
+
return unwrapOrImpl(optional, defaultValue);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
case 1: {
|
|
53
|
+
// Curried version: first argument is default value
|
|
54
|
+
const [defaultValue] = args;
|
|
55
|
+
return (optional: Optional<Unwrap<O>>) =>
|
|
56
|
+
unwrapOrImpl(optional, defaultValue);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const unwrapOrImpl = <O extends UnknownOptional, D>(
|
|
62
|
+
optional: O,
|
|
63
|
+
defaultValue: D,
|
|
64
|
+
): D | Unwrap<O> => unwrap(optional) ?? defaultValue;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { type Unwrap } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Unwraps an `Optional`, returning the contained value. Throws an error if
|
|
6
|
+
* the `Optional` is `None`.
|
|
7
|
+
*
|
|
8
|
+
* This is a safer alternative to direct value access when you know the
|
|
9
|
+
* Optional should contain a value. Use this method when an empty Optional
|
|
10
|
+
* represents a programming error or unexpected condition.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* const present = Optional.some('available');
|
|
16
|
+
*
|
|
17
|
+
* assert(Optional.unwrapThrow(present) === 'available');
|
|
18
|
+
* assert.throws(
|
|
19
|
+
* () => Optional.unwrapThrow(Optional.none),
|
|
20
|
+
* /has failed because it is `None`/u,
|
|
21
|
+
* );
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @template O The `UnknownOptional` type to unwrap.
|
|
25
|
+
* @param optional The `Optional` to unwrap.
|
|
26
|
+
* @returns The contained value if `Some`.
|
|
27
|
+
* @throws {Error} Error with message "`unwrapThrow()` has failed because it
|
|
28
|
+
* is `None`" if the `Optional` is `None`.
|
|
29
|
+
*/
|
|
30
|
+
export const unwrapThrow = <O extends UnknownOptional>(
|
|
31
|
+
optional: O,
|
|
32
|
+
): Unwrap<O> => {
|
|
33
|
+
if (isSome(optional)) {
|
|
34
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
35
|
+
return optional.value as Unwrap<O>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
throw new Error('`unwrapThrow()` has failed because it is `None`');
|
|
39
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { type Unwrap } from './types.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Unwraps an `Optional`, returning the contained value or `undefined` if
|
|
6
|
+
* empty.
|
|
7
|
+
*
|
|
8
|
+
* This function provides a safe way to extract values from Optionals without
|
|
9
|
+
* throwing exceptions. It has overloaded behavior based on the type:
|
|
10
|
+
*
|
|
11
|
+
* - For `Some<T>`: Always returns `T` (guaranteed by type system)
|
|
12
|
+
* - For general `Optional<T>`: Returns `T | undefined`
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* const someString = Optional.some('text');
|
|
18
|
+
* const noneString = Optional.none as Optional<string>;
|
|
19
|
+
*
|
|
20
|
+
* assert(Optional.unwrap(someString) === 'text');
|
|
21
|
+
* assert(Optional.unwrap(noneString) === undefined);
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* @template O The `UnknownOptional` type to unwrap.
|
|
25
|
+
* @param optional The `Optional` to unwrap.
|
|
26
|
+
* @returns The contained value if `Some`, otherwise `undefined`.
|
|
27
|
+
*/
|
|
28
|
+
export function unwrap<O extends Some<unknown>>(optional: O): Unwrap<O>;
|
|
29
|
+
|
|
30
|
+
export function unwrap<O extends UnknownOptional>(
|
|
31
|
+
optional: O,
|
|
32
|
+
): Unwrap<O> | undefined;
|
|
33
|
+
|
|
34
|
+
export function unwrap<O extends UnknownOptional>(
|
|
35
|
+
optional: O,
|
|
36
|
+
): Unwrap<O> | undefined {
|
|
37
|
+
return isSome(optional)
|
|
38
|
+
? // eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
39
|
+
(optional.value as Unwrap<O>)
|
|
40
|
+
: undefined;
|
|
41
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { isSome } from './optional-is-some.mjs';
|
|
2
|
+
import { none } from './optional-none.mjs';
|
|
3
|
+
import { some } from './optional-some.mjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Combines two `Optional` values into a single `Optional` containing a tuple.
|
|
7
|
+
* If either `Optional` is `None`, returns `None`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const zipped = Optional.zip(Optional.some('left'), Optional.some(1));
|
|
13
|
+
*
|
|
14
|
+
* assert.ok(Optional.isSome(zipped));
|
|
15
|
+
* if (Optional.isSome(zipped)) {
|
|
16
|
+
* const expected: readonly [string, number] = ['left', 1];
|
|
17
|
+
* assert.deepStrictEqual(zipped.value, expected);
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* const missing = Optional.zip(
|
|
21
|
+
* Optional.some('value'),
|
|
22
|
+
* Optional.none as Optional<number>,
|
|
23
|
+
* );
|
|
24
|
+
*
|
|
25
|
+
* assert.deepStrictEqual(missing, Optional.none);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @template A The value type of the first `Optional`.
|
|
29
|
+
* @template B The value type of the second `Optional`.
|
|
30
|
+
* @param optionalA The first `Optional`.
|
|
31
|
+
* @param optionalB The second `Optional`.
|
|
32
|
+
* @returns An `Optional` containing a tuple of both values, or `None`.
|
|
33
|
+
*/
|
|
34
|
+
export const zip = <A, const B>(
|
|
35
|
+
optionalA: Optional<A>,
|
|
36
|
+
optionalB: Optional<B>,
|
|
37
|
+
): Optional<readonly [A, B]> =>
|
|
38
|
+
isSome(optionalA) && isSome(optionalB)
|
|
39
|
+
? some([optionalA.value, optionalB.value] as const)
|
|
40
|
+
: none;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** @internal String literal tag to identify the 'Some' variant of Optional. */
|
|
2
|
+
export const SomeTypeTagName: Some<unknown>['$$tag'] =
|
|
3
|
+
'ts-data-forge::Optional.some';
|
|
4
|
+
|
|
5
|
+
/** @internal String literal tag to identify the 'None' variant of Optional. */
|
|
6
|
+
export const NoneTypeTagName: None['$$tag'] = 'ts-data-forge::Optional.none';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the value type `S` from an {@link Some}<S>. If the
|
|
3
|
+
* {@link Optional} is {@link None}, resolves to `never`.
|
|
4
|
+
*
|
|
5
|
+
* @template O The {@link UnknownOptional} type to unwrap.
|
|
6
|
+
*/
|
|
7
|
+
export type Unwrap<O extends UnknownOptional> =
|
|
8
|
+
O extends Some<infer S> ? S : never;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Narrows an {@link UnknownOptional} type to {@link Some}<S> if it is a
|
|
12
|
+
* {@link Some}. If the {@link Optional} is {@link None}, resolves to `never`.
|
|
13
|
+
*
|
|
14
|
+
* @template O The {@link UnknownOptional} type to narrow.
|
|
15
|
+
*/
|
|
16
|
+
export type NarrowToSome<O extends UnknownOptional> = O extends None
|
|
17
|
+
? never
|
|
18
|
+
: O;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Narrows an {@link UnknownOptional} type to {@link None} if it is a
|
|
22
|
+
* {@link None}. If the {@link Optional} is {@link Some}<S>, resolves to never.
|
|
23
|
+
*
|
|
24
|
+
* @template O The {@link UnknownOptional} type to narrow.
|
|
25
|
+
*/
|
|
26
|
+
export type NarrowToNone<O extends UnknownOptional> = O extends None
|
|
27
|
+
? O
|
|
28
|
+
: never;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as Optional from './impl/index.mjs';
|