- #169
648a8de
Thanks @ahrjarrett! - ### breaking changes- All of the members of Universal namespace have changed their implementations
- Since
any-ts
is still pre v1.0, this is a minor version bump. - The API is relatively stable; I expect one (1) more breaking change before releasing v1.0.0 this fall
- Since
- All of the members of Universal namespace have changed their implementations
- #167
4234c81
Thanks @ahrjarrett! - deprecate:Identity
-- usenewtype
instead
- #165
60f77df
Thanks @ahrjarrett! - fix:some.entriesOf
when used in matching position
- #163
29e5043
Thanks @ahrjarrett! - feat: addssome.entriesOf
- #161
b06a828
Thanks @ahrjarrett! - fix: correctly exportsmatch.finite
namespace
-
#157
9fb7871
Thanks @ahrjarrett! - break: renamesmatch.finite*
tomatch.finite.*
for example:
match.finiteArray -> match.finite.array match.nonfiniteArray -> match.nonfinite.array
- #160
350fd9f
Thanks @ahrjarrett! - fix: re-exportssome.instanceOf
; feat: addsany.maybeIndexedBy
-
bf5df0f: ### new features
- added
match
, a namespace for advanced pattern matching - added
any.functions
to describe any array of functions
a few members of the
some
namespace behave differently than before:-
some.keyOf
: this change was made to support a homomorphicobject.map
function that operates on both arrays and objects, preserves structure in either case.An example implementation:
/** * {@link map `map [overload 1/2]`} ("data-last") * * [TypeScript playground](https://tsplay.dev/weA2Yw) * * {@link map `map`} takes two arguments: * 1. a function * 2. a composite data structure that contains one or more targets to apply the function to * * A unique feature of this implementation is its polymorphism: it doesn't care whether the * composite data structure is an array, or whether it's an object. It will apply the argument * to each of the children, and will preserve the structure of the original shape. * * **Trade-off:** the data-last overload of {@link map `map`} is optimized for function composition. * It works best when used inside a call to {@link fn.pipe `fn.pipe`} or {@link fn.flow `fn.flow`}. * It comes with greater potential for code re-use, at the cost of slightly slower performance. * * **Ergonomics:** if you'd prefer to provide both arguments at the same time, see overload #2. */ export function map<const xs, target>( fn: (x: xs[some.keyof<xs>], ix: some.keyof<xs>, xs: xs) => target ): (xs: xs) => { [ix in keyof xs]: target }; /** * {@link map `map [overload 2/2]`} ("data-first") * * [TypeScript playground](https://tsplay.dev/weA2Yw) * * {@link map `map`} is a polymorphic function that accepts a function and a data structure (such * as an array or object) to apply the function to. * * A unique feature of this implementation is its ability to abstract away the type of the data * structure it maps the function over; whether you pass it an object or an array, it will handle * applying the function to the data strucuture's values and returning a data structure whose type * corresponds 1-1 with the type of input. * * **Trade-off:** the data-first overload of {@link map `map`} evaluates eagerly. It comes with * slightly better performance than the data-last overload, at the cost of reusability. * * **Ergonomics:** if you'd prefer to use {@link map `map`} in a pipeline, see overload #1. */ export function map<const xs, target>( xs: xs, fn: (x: xs[some.keyof<xs>], xs: xs) => target ): { [ix in keyof xs]: target }; // impl. export function map<const xs, target>( ...args: | [fn: (x: xs[some.keyof<xs>], ix: some.keyof<xs>, xs: xs) => target] | [ xs: xs, fn: (x: xs[some.keyof<xs>], ix: some.keyof<xs>, xs: xs) => target ] ) { if (args.length === 1) return (xs: xs) => map(xs, args[0]); else { const [xs, fn] = args; if (globalThis.Array.isArray(xs)) return xs.map(fn as never); else { let out: any.struct = {}; for (const k in xs) out[k] = fn(xs[k] as never, k as never, xs); return out; } } }
-
some.entryOf
slightly different semantics to support a polymorphicobject.entries
function -
some.valueOf
slightly different semantics to support a polymorphicobject.values
function
- added
- 1ea3201: fix:
Case.pascal
andCase.camel
converting all caps incorrectly - 58593b0: fix: removes "module" field in manifest so
any-ts
plays nice with Vite
- d10ee8c: fix: ensure
string.intercalate
produces a string result
-
5e1829b: fix: expose
any_*
constructorsFixes:
Exported variable 'x' has or is using name 'any_dict' from external module "node_modules/any-ts/dist/index" but cannot be named.
- 9065c4b: fix: account for contravariance in index signature of
any.dict
- 9d96ba7: feat: adds
has.oneMember
-
d2c28aa: feat: adds
has
module-
has.oneProperty
lets you express a constraint that the input type contains exactly 1 property. For example:/** * @example * const one = singleton({ a: 1 }) // ✅ * const zero = singleton({}) // 🚫 * // ^? const zero: never * const two = singleton({ a: 1, b: 2 }) // 🚫 * // ^? const two: never */ declare function singleton<const T extends has.oneProperty<T>>( objectWithExactlyOneProperty: T ): T;
Note:
has.oneProperty
accepts 2 additional optional type parameters- an invariant, which allows you to apply an additional constraint on the type of the property itself; and
- a "debug" flag, which, if non-never, changes the behavior of
has.oneProperty
to raise a customTypeError
ifT
fails to satisfy the constraint
-
has.oneElement
/** * @example * const one = singleton([1]) // ✅ * // ^? const one: readonly [1] * * const zero = singleton([]) // 🚫 * // ^? const zero: never * const two = singleton([1, 2]) // 🚫 * // ^? const two: never */ declare function oneNumber<const T extends has.oneElement<T, number>>( tupleContainingOneNumber: T ): T;
Note: like
has.oneProperty
,has.oneElement
also accepts 2 additional optional type parameters- an invariant, which allows you to apply an additional constraint on the type of the element itself; and,
- a "debug" flag, which, if non-never, changes the behavior of
has.oneElement
to raise a customTypeError
ifT
fails to satisfy the constraint
-
- f2e8ef6: docs: fix
empty.string
docs (moves them to the right jsdoc node)
- 9fcdbda: - feat: separates
empty
fromnonempty
- docs: documents
empty
andnonempty
namespaces - feat: adds simplified
TypeError
module (type-error/type-error.ts
) - todo: creates this todo: #132
- docs: documents
- 10981fe: fix:
string.camel and
string.pascalhandle non-finite strings now
- 8c4fcc5: feat: adds
- 6dccbe0: 24e3d93 * @ahrjarrett/v0.43.3 feat: adds simplified
Kind
implementation (available now underexperimental.Kind
) - 6dccbe0: feat: adds
any.four
,mut.four
, exports experimental Kind encoding fromexperimental.Kind
- 746458e: feat: adds
some.class
,any.instanceOf
- 54b7436: feat: adds
mut.json
- bf4769e: simplifies
check
API (full rewrite); addstypecheck
API for throwing custom TypeErrors on failure case
- 42f115c: 🧹 cleans up
Catch
module to expose fewer types directly - 0a29710: fixes broken internal import of
join
- 66e5d7a: infra: library is written in ESM now. still targeting both CJS and ESM
- a25502d: feat: merges traversable and traversal into Tree
- 39fefd8: fixes broken version script
- 4facde2: fix typechecking issue in
Lens.tree
- dd6dc3a: adds type-checking to release pipeline to make it harder to publish bad code
- a780e80: fix: uses import.meta.url instead of __dirname
- 46b499e: tweaks a few aliases to prevent compiler from appending
$1
,$2
to the end of output types
- 804b331: fix: moves
array
member declar… Andrew Jarrett 1 minute
- 3595cde: feat: merge
mut
namespace withmutable
type (both now exported as justmut
) - 5fe03fc: feat: adds
Identity
type - 857ca94: feat:
eval
type (a simpler version ofevaluate
) is now exported from the library
- 858c11e: chore: now exports submodules at the toplevel:
array.nonempty
: now also available asnonemptyArray
array.queue
: now also available asqueue
array.tuple
: now also available astuple
- 8638a0f: fix: exports
array
submodule
- 89f1189: feat: adds
tuple
module toarray.tuple
- 4c017dd: internal: move
semantic-never*
tonever*
- 4c017dd: feat: adds
array
module (includes submodules:array.queue, array.nonempty
)
- ce4239e: chore: fix
object
module exports
- 77e9cfd: export
filter
andfilterKeys
fromobject
module
- ffc37c8: fix: exports
filter
from object module; moves function signatures to experimental status
- 6cd69ad: infra: moves commit title to github action
- bbbb0b7: chore: exports internal
Fn*
type constructors
-
e611ada: ## features adds:
object.filter
object.filterKeys
deprecates:
any.arrayof
- useany.arrayOf
insteadany.entriesof
- useany.entriesOf
insteadany.entryof
- useany.entryOf
insteadany.keysof
- useany.keysOf
insteadany.subtypeof
- useany.subtypeOf
insteadany.indexedby
- useany.indexedBy
instead
- 66a6800: feat: adds
Widen
type + ambient namespace
- 1dd4331: ci
- 4eaefdb: fix: don't run
pnpm run version
inbin/version
, runchangeset version
- 6060a67: fix: straightens out release pipeline
- fix: configure changesets to make access public
- fix: adds npm script to ci
- fix: adds publish script
- chore: commits lockfile
- chore: specify node version in CI
- 2c28f7e: uses changesets to manage version; updates deps
- 8a688b2: chore: upgrades deps
- f7fd9e2: initial release test
- infra: adds changesets to release pipeline