| import type { ReactNode } from 'react' | |
| import type { OptionWithDescription } from './select.js' | |
| type OptionMapItem<T> = { | |
| label: ReactNode | |
| value: T | |
| description?: string | |
| previous: OptionMapItem<T> | undefined | |
| next: OptionMapItem<T> | undefined | |
| index: number | |
| } | |
| export default class OptionMap<T> extends Map<T, OptionMapItem<T>> { | |
| readonly first: OptionMapItem<T> | undefined | |
| readonly last: OptionMapItem<T> | undefined | |
| constructor(options: OptionWithDescription<T>[]) { | |
| const items: Array<[T, OptionMapItem<T>]> = [] | |
| let firstItem: OptionMapItem<T> | undefined | |
| let lastItem: OptionMapItem<T> | undefined | |
| let previous: OptionMapItem<T> | undefined | |
| let index = 0 | |
| for (const option of options) { | |
| const item = { | |
| label: option.label, | |
| value: option.value, | |
| description: option.description, | |
| previous, | |
| next: undefined, | |
| index, | |
| } | |
| if (previous) { | |
| previous.next = item | |
| } | |
| firstItem ||= item | |
| lastItem = item | |
| items.push([option.value, item]) | |
| index++ | |
| previous = item | |
| } | |
| super(items) | |
| this.first = firstItem | |
| this.last = lastItem | |
| } | |
| } | |