import type { ReadonlyHeldSelectorFamilyOptions, ReadonlyHeldSelectorFamilyToken, ReadonlyPureSelectorFamilyOptions, ReadonlyPureSelectorFamilyToken, SelectorFamilyToken, WritableHeldSelectorFamilyOptions, WritableHeldSelectorFamilyToken, WritablePureSelectorFamilyOptions, WritablePureSelectorFamilyToken, } from "atom.io" import type { Canonical } from "atom.io/foundations/canonical" import type { RootStore } from "../transaction/index.ts" import { createReadonlyHeldSelectorFamily } from "./create-readonly-held-selector-family.ts" import { createReadonlyPureSelectorFamily } from "./create-readonly-pure-selector-family.ts" import { createWritableHeldSelectorFamily } from "./create-writable-held-selector-family.ts" import { createWritablePureSelectorFamily } from "./create-writable-pure-selector-family.ts" export function createSelectorFamily( store: RootStore, options: WritableHeldSelectorFamilyOptions, ): WritableHeldSelectorFamilyToken export function createSelectorFamily( store: RootStore, options: ReadonlyHeldSelectorFamilyOptions, ): ReadonlyHeldSelectorFamilyToken export function createSelectorFamily( store: RootStore, options: WritablePureSelectorFamilyOptions, ): WritablePureSelectorFamilyToken export function createSelectorFamily( store: RootStore, options: ReadonlyPureSelectorFamilyOptions, ): ReadonlyPureSelectorFamilyToken export function createSelectorFamily( store: RootStore, options: | ReadonlyHeldSelectorFamilyOptions | ReadonlyPureSelectorFamilyOptions | WritableHeldSelectorFamilyOptions | WritablePureSelectorFamilyOptions, ): SelectorFamilyToken { const isWritable = `set` in options const isHeld = `const` in options if (isHeld && isWritable) { return createWritableHeldSelectorFamily(store, options, undefined) } if (isHeld) { return createReadonlyHeldSelectorFamily(store, options, undefined) } if (isWritable) { return createWritablePureSelectorFamily(store, options) } return createReadonlyPureSelectorFamily(store, options) }