From 273e8b1d6a97c066eff6711db270f0b737d91528 Mon Sep 17 00:00:00 2001 From: Quantum Date: Tue, 17 Jun 2025 00:35:04 -0400 Subject: [PATCH] common: define types for Mayan sacred calendar (Tzolk'in) --- common/src/mayan.test.ts | 29 +++++++++++++++++++ common/src/mayan.ts | 60 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 common/src/mayan.test.ts create mode 100644 common/src/mayan.ts diff --git a/common/src/mayan.test.ts b/common/src/mayan.test.ts new file mode 100644 index 0000000..5d9aba4 --- /dev/null +++ b/common/src/mayan.test.ts @@ -0,0 +1,29 @@ +import {TzolkinName, tzolkinName, formatTzolkin} from './mayan'; + +describe('tzolkinName', () => { + it('should return correct name for IMIX', () => { + expect(tzolkinName(TzolkinName.IMIX)).toBe('Imix'); + }); + + it('should return correct name for IK', () => { + expect(tzolkinName(TzolkinName.IK)).toBe('Ikʼ'); + }); + + it('should return correct name for AJAW', () => { + expect(tzolkinName(TzolkinName.AJAW)).toBe('Ajaw'); + }); +}); + +describe('formatTzolkin', () => { + it('should format tzolkin with number 1 and IMIX', () => { + expect(formatTzolkin({number: 1, name: TzolkinName.IMIX})).toBe('1 Imix'); + }); + + it('should format tzolkin with number 13 and AJAW', () => { + expect(formatTzolkin({number: 13, name: TzolkinName.AJAW})).toBe('13 Ajaw'); + }); + + it('should format tzolkin with number 7 and KABAN', () => { + expect(formatTzolkin({number: 7, name: TzolkinName.KABAN})).toBe('7 Kabʼan'); + }); +}); diff --git a/common/src/mayan.ts b/common/src/mayan.ts new file mode 100644 index 0000000..0e0d16e --- /dev/null +++ b/common/src/mayan.ts @@ -0,0 +1,60 @@ +export enum TzolkinName { + IMIX, + IK, + AKBAL, + KAN, + CHIKCHAN, + KIMI, + MANIK, + LAMAT, + MULUK, + OK, + CHUWEN, + EB, + BEN, + IX, + MEN, + KIB, + KABAN, + ETZNAB, + KAWAK, + AJAW +} + +export type TzolkinNumber = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13; + +export type Tzolkin = { + number: TzolkinNumber, + name: TzolkinName, +}; + +const tzolkinNames: Record = { + [TzolkinName.IMIX]: 'Imix', + [TzolkinName.IK]: 'Ikʼ', + [TzolkinName.AKBAL]: 'Akʼbʼal', + [TzolkinName.KAN]: 'Kʼan', + [TzolkinName.CHIKCHAN]: 'Chikchan', + [TzolkinName.KIMI]: 'Kimi', + [TzolkinName.MANIK]: 'Manikʼ', + [TzolkinName.LAMAT]: 'Lamat', + [TzolkinName.MULUK]: 'Muluk', + [TzolkinName.OK]: 'Ok', + [TzolkinName.CHUWEN]: 'Chuwen', + [TzolkinName.EB]: 'Ebʼ', + [TzolkinName.BEN]: 'Bʼen', + [TzolkinName.IX]: 'Ix', + [TzolkinName.MEN]: 'Men', + [TzolkinName.KIB]: 'Kibʼ', + [TzolkinName.KABAN]: 'Kabʼan', + [TzolkinName.ETZNAB]: 'Etzʼnabʼ', + [TzolkinName.KAWAK]: 'Kawak', + [TzolkinName.AJAW]: 'Ajaw', +}; + +export function tzolkinName(name: TzolkinName): string { + return tzolkinNames[name]; +} + +export function formatTzolkin(tzolkin: Tzolkin): string { + return `${tzolkin.number} ${tzolkinName(tzolkin.name)}`; +}