import type { LoggerFriendly, LoggerFriendlyOptions } from "#Source/log/index.ts" import { Logger } from "#Source/log/index.ts" import type { Either } from "#Source/result/index.ts" export interface GetItemLeft { code: "NO_CHOICE" | "NO_AVAILABLE" } export interface GetItemRight { item: Target markAvailable: () => void markUnavailable: () => void } export type GetItemResult = Either> export interface BaseSelectorOptions extends LoggerFriendlyOptions { id: string itemList: Target[] } export abstract class BaseSelector implements LoggerFriendly { readonly logger: Logger private id: string constructor(options: BaseSelectorOptions) { this.logger = Logger.fromOptions(options).setDefaultName("BaseSelector") this.id = options.id } getId(): string { return this.id } abstract getItem(): Promise> }