import type { ReadonlyHeldSelectorOptions, ReadonlyHeldSelectorToken, ReadonlyPureSelectorOptions, ReadonlyPureSelectorToken, WritableHeldSelectorOptions, WritableHeldSelectorToken, WritablePureSelectorOptions, WritablePureSelectorToken, } from "atom.io" import type { Store } from "../store/index.ts" import { createReadonlyHeldSelector } from "./create-readonly-held-selector.ts" import { createReadonlyPureSelector } from "./create-readonly-pure-selector.ts" import { createWritableHeldSelector } from "./create-writable-held-selector.ts" import { createWritablePureSelector } from "./create-writable-pure-selector.ts" export function createStandaloneSelector( store: Store, options: WritableHeldSelectorOptions, ): WritableHeldSelectorToken export function createStandaloneSelector( store: Store, options: ReadonlyHeldSelectorOptions, ): ReadonlyHeldSelectorToken export function createStandaloneSelector( store: Store, options: WritablePureSelectorOptions, ): WritablePureSelectorToken export function createStandaloneSelector( store: Store, options: ReadonlyPureSelectorOptions, ): ReadonlyPureSelectorToken export function createStandaloneSelector( store: Store, options: | ReadonlyHeldSelectorOptions | ReadonlyPureSelectorOptions | WritableHeldSelectorOptions | WritablePureSelectorOptions, ): | ReadonlyHeldSelectorToken | ReadonlyPureSelectorToken | WritableHeldSelectorToken | WritablePureSelectorToken { const isWritable = `set` in options const isHeld = `const` in options if (isHeld && isWritable) { const state = createWritableHeldSelector(store, options, undefined) store.on.selectorCreation.next(state) return state } if (isHeld) { const state = createReadonlyHeldSelector(store, options, undefined) store.on.selectorCreation.next(state) return state } if (isWritable) { const state = createWritablePureSelector(store, options, undefined) store.on.selectorCreation.next(state) return state } const state = createReadonlyPureSelector(store, options, undefined) store.on.selectorCreation.next(state) return state }