1 line
4.5 KiB
Plaintext
1 line
4.5 KiB
Plaintext
{"version":3,"file":"series.mjs","sources":["../../src/series.ts"],"sourcesContent":["import { list } from './array'\n\n/**\n * Creates a series object around a list of values\n * that should be treated with order.\n */\nexport const series = <T>(\n items: T[],\n toKey: (item: T) => string | symbol = item => `${item}`\n) => {\n const { indexesByKey, itemsByIndex } = items.reduce(\n (acc, item, idx) => ({\n indexesByKey: {\n ...acc.indexesByKey,\n [toKey(item)]: idx\n },\n itemsByIndex: {\n ...acc.itemsByIndex,\n [idx]: item\n }\n }),\n {\n indexesByKey: {} as Record<string | symbol, number>,\n itemsByIndex: {} as Record<number, T>\n }\n )\n /**\n * Given two values in the series, returns the\n * value that occurs earlier in the series\n */\n const min = (a: T, b: T): T => {\n return indexesByKey[toKey(a)] < indexesByKey[toKey(b)] ? a : b\n }\n /**\n * Given two values in the series, returns the\n * value that occurs later in the series\n */\n const max = (a: T, b: T): T => {\n return indexesByKey[toKey(a)] > indexesByKey[toKey(b)] ? a : b\n }\n /**\n * Returns the first item from the series\n */\n const first = (): T => {\n return itemsByIndex[0]\n }\n /**\n * Returns the last item in the series\n */\n const last = (): T => {\n return itemsByIndex[items.length - 1]\n }\n /**\n * Given an item in the series returns the next item\n * in the series or default if the given value is\n * the last item in the series\n */\n const next = (current: T, defaultValue?: T): T => {\n return (\n itemsByIndex[indexesByKey[toKey(current)] + 1] ?? defaultValue ?? first()\n )\n }\n /**\n * Given an item in the series returns the previous item\n * in the series or default if the given value is\n * the first item in the series\n */\n const previous = (current: T, defaultValue?: T): T => {\n return (\n itemsByIndex[indexesByKey[toKey(current)] - 1] ?? defaultValue ?? last()\n )\n }\n /**\n * A more dynamic method than next and previous that\n * lets you move many times in either direction.\n * @example series(weekdays).spin('wednesday', 3) => 'monday'\n * @example series(weekdays).spin('wednesday', -3) => 'friday'\n */\n const spin = (current: T, num: number): T => {\n if (num === 0) return current\n const abs = Math.abs(num)\n const rel = abs > items.length ? abs % items.length : abs\n return list(0, rel - 1).reduce(\n acc => (num > 0 ? next(acc) : previous(acc)),\n current\n )\n }\n return {\n min,\n max,\n first,\n last,\n next,\n previous,\n spin\n }\n}\n"],"names":[],"mappings":";;AAMO,MAAM,SAAS,CACpB,KAAA,EACA,KAAsC,GAAA,CAAA,IAAA,KAAQ,GAAG,IAC9C,CAAA,CAAA,KAAA;AACH,EAAA,MAAM,EAAE,YAAA,EAAc,YAAa,EAAA,GAAI,KAAM,CAAA,MAAA;AAAA,IAC3C,CAAC,GAAK,EAAA,IAAA,EAAM,GAAS,MAAA;AAAA,MACnB,YAAc,EAAA;AAAA,QACZ,GAAG,GAAI,CAAA,YAAA;AAAA,QACP,CAAC,KAAM,CAAA,IAAI,CAAI,GAAA,GAAA;AAAA,OACjB;AAAA,MACA,YAAc,EAAA;AAAA,QACZ,GAAG,GAAI,CAAA,YAAA;AAAA,QACP,CAAC,GAAM,GAAA,IAAA;AAAA,OACT;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,cAAc,EAAC;AAAA,MACf,cAAc,EAAC;AAAA,KACjB;AAAA,GACF,CAAA;AAKA,EAAM,MAAA,GAAA,GAAM,CAAC,CAAA,EAAM,CAAY,KAAA;AAC7B,IAAO,OAAA,YAAA,CAAa,MAAM,CAAC,CAAA,CAAA,GAAK,aAAa,KAAM,CAAA,CAAC,KAAK,CAAI,GAAA,CAAA,CAAA;AAAA,GAC/D,CAAA;AAKA,EAAM,MAAA,GAAA,GAAM,CAAC,CAAA,EAAM,CAAY,KAAA;AAC7B,IAAO,OAAA,YAAA,CAAa,MAAM,CAAC,CAAA,CAAA,GAAK,aAAa,KAAM,CAAA,CAAC,KAAK,CAAI,GAAA,CAAA,CAAA;AAAA,GAC/D,CAAA;AAIA,EAAA,MAAM,QAAQ,MAAS;AACrB,IAAA,OAAO,YAAa,CAAA,CAAA,CAAA,CAAA;AAAA,GACtB,CAAA;AAIA,EAAA,MAAM,OAAO,MAAS;AACpB,IAAO,OAAA,YAAA,CAAa,MAAM,MAAS,GAAA,CAAA,CAAA,CAAA;AAAA,GACrC,CAAA;AAMA,EAAM,MAAA,IAAA,GAAO,CAAC,OAAA,EAAY,YAAwB,KAAA;AAChD,IAAA,OACE,aAAa,YAAa,CAAA,KAAA,CAAM,OAAO,CAAK,CAAA,GAAA,CAAA,CAAA,IAAM,gBAAgB,KAAM,EAAA,CAAA;AAAA,GAE5E,CAAA;AAMA,EAAM,MAAA,QAAA,GAAW,CAAC,OAAA,EAAY,YAAwB,KAAA;AACpD,IAAA,OACE,aAAa,YAAa,CAAA,KAAA,CAAM,OAAO,CAAK,CAAA,GAAA,CAAA,CAAA,IAAM,gBAAgB,IAAK,EAAA,CAAA;AAAA,GAE3E,CAAA;AAOA,EAAM,MAAA,IAAA,GAAO,CAAC,OAAA,EAAY,GAAmB,KAAA;AAC3C,IAAA,IAAI,GAAQ,KAAA,CAAA;AAAG,MAAO,OAAA,OAAA,CAAA;AACtB,IAAM,MAAA,GAAA,GAAM,IAAK,CAAA,GAAA,CAAI,GAAG,CAAA,CAAA;AACxB,IAAA,MAAM,MAAM,GAAM,GAAA,KAAA,CAAM,MAAS,GAAA,GAAA,GAAM,MAAM,MAAS,GAAA,GAAA,CAAA;AACtD,IAAA,OAAO,IAAK,CAAA,CAAA,EAAG,GAAM,GAAA,CAAC,CAAE,CAAA,MAAA;AAAA,MACtB,SAAQ,GAAM,GAAA,CAAA,GAAI,KAAK,GAAG,CAAA,GAAI,SAAS,GAAG,CAAA;AAAA,MAC1C,OAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AACA,EAAO,OAAA;AAAA,IACL,GAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,GACF,CAAA;AACF;;;;"} |