common: define types for Mayan sacred calendar (Tzolk'in)

This commit is contained in:
Quantum 2025-06-17 00:35:04 -04:00
parent 3c269ab7c6
commit 273e8b1d6a
2 changed files with 89 additions and 0 deletions

29
common/src/mayan.test.ts Normal file
View file

@ -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');
});
});

60
common/src/mayan.ts Normal file
View file

@ -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, string> = {
[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)}`;
}