From 8dcc1dfc1d19eb80180a4985e488b822acf2012b Mon Sep 17 00:00:00 2001 From: Michael Arnaldi Date: Thu, 25 Aug 2022 12:13:23 +0000 Subject: [PATCH] chore: add Ord.tuple --- .changeset/heavy-steaks-hope.md | 5 +++++ packages/stdlib/_src/prelude/Ord.ts | 1 + packages/stdlib/_src/prelude/Ord/tuple.ts | 27 +++++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 .changeset/heavy-steaks-hope.md create mode 100644 packages/stdlib/_src/prelude/Ord/tuple.ts diff --git a/.changeset/heavy-steaks-hope.md b/.changeset/heavy-steaks-hope.md new file mode 100644 index 00000000..714b48e7 --- /dev/null +++ b/.changeset/heavy-steaks-hope.md @@ -0,0 +1,5 @@ +--- +"@tsplus/stdlib": patch +--- + +Add Ord.tuple diff --git a/packages/stdlib/_src/prelude/Ord.ts b/packages/stdlib/_src/prelude/Ord.ts index 145ab995..8e2f8022 100644 --- a/packages/stdlib/_src/prelude/Ord.ts +++ b/packages/stdlib/_src/prelude/Ord.ts @@ -5,4 +5,5 @@ export * from "@tsplus/stdlib/prelude/Ord/definition" export * from "@tsplus/stdlib/prelude/Ord/getAssociative" export * from "@tsplus/stdlib/prelude/Ord/getAssociativeIdentity" export * from "@tsplus/stdlib/prelude/Ord/operations" +export * from "@tsplus/stdlib/prelude/Ord/tuple" // codegen:end diff --git a/packages/stdlib/_src/prelude/Ord/tuple.ts b/packages/stdlib/_src/prelude/Ord/tuple.ts new file mode 100644 index 00000000..b64811d2 --- /dev/null +++ b/packages/stdlib/_src/prelude/Ord/tuple.ts @@ -0,0 +1,27 @@ +export type NonEmptyArrayOrd = Array> & { readonly 0: Ord } + +export type TupleOrd = { + [K in keyof T]: [T[K]] extends [Ord] ? A : never +} + +/** + * Derives an Ord instance for a tuple + * + * @tsplus static Ord/Ops tuple + */ +export function tuple( + ...ords: T & { + readonly 0: Ord + } +): Ord>> { + return Ord((first, second) => { + let i = 0 + for (; i < ords.length - 1; i++) { + const r = ords[i]!.compare(first[i], second[i]) + if (r !== 0) { + return r + } + } + return ords[i]!.compare(first[i], second[i]) + }) +}