From 0bd85ce30559140bc358b915e0273d4882b2ace3 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 16:56:52 -0800 Subject: [PATCH 1/3] add tests for tuple key type --- test/types/TupleKeyTests.test.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 test/types/TupleKeyTests.test.ts diff --git a/test/types/TupleKeyTests.test.ts b/test/types/TupleKeyTests.test.ts new file mode 100644 index 0000000..f4760ef --- /dev/null +++ b/test/types/TupleKeyTests.test.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from "@jest/globals"; +import { TupleKey } from "../../src/types/TupleKey"; + +describe("TupleKey", () => { + it("stores a value copy of the original tuple", () => { + const tuple: [string, string] = ["150", "539"]; + const tupleKey = new TupleKey(...tuple); + + expect(tupleKey.tuple).toEqual(tuple); + }); + + it("returns a string representation of itself", () => { + const tuple: [string, string] = ["150", "539"]; + const tupleKey = new TupleKey(...tuple); + + expect(`${tupleKey}`).toEqual("150|539"); + }); +}); \ No newline at end of file From 7de1fd757e164d5f291d2572778a2bfdda190195 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 16:57:00 -0800 Subject: [PATCH 2/3] add TupleKey class --- src/types/TupleKey.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/types/TupleKey.ts diff --git a/src/types/TupleKey.ts b/src/types/TupleKey.ts new file mode 100644 index 0000000..08dcfb4 --- /dev/null +++ b/src/types/TupleKey.ts @@ -0,0 +1,19 @@ +const separator = "|"; + +export class TupleKey { + public readonly tuple: T; + private readonly strKey: string; + + constructor(...tuple: T) { + this.tuple = tuple; + this.strKey = tuple.join(separator); + } + + toString(): string { + return this.strKey; + } + + valueOf(): string { + return this.strKey; + } +} From 6f1464d55a7a860dc7f22a9d1d3eae2c4cc95063 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Wed, 29 Jan 2025 17:07:35 -0800 Subject: [PATCH 3/3] add test for object as key use case --- test/types/TupleKeyTests.test.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/types/TupleKeyTests.test.ts b/test/types/TupleKeyTests.test.ts index f4760ef..ac260dd 100644 --- a/test/types/TupleKeyTests.test.ts +++ b/test/types/TupleKeyTests.test.ts @@ -15,4 +15,17 @@ describe("TupleKey", () => { expect(`${tupleKey}`).toEqual("150|539"); }); + + it("supports usage as key in object", () => { + const tupleKey1 = new TupleKey("1", "2"); + const tupleKey2 = new TupleKey("3", "4"); + + const sampleObject = { + [tupleKey1.toString()]: "value1", + [tupleKey2.toString()]: "value2", + }; + + expect(sampleObject[tupleKey1.toString()]).toEqual("value1"); + expect(sampleObject[(new TupleKey("1", "2")).toString()]).toEqual("value1"); + }); }); \ No newline at end of file