deno.land / x / solid_signals@solid-signals@1.3.7 / src / signals / composable / createArray / createArray.ts
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384import { createSignal, Signal } from "solid-js";import { SignalOptions } from "solid-js/types/reactive/signal";import { getNativeExtensions, NativeMutators, signalExtender,} from "../../../utils/signal.js";
const arrayMutators = [ "copyWithin", "fill", "pop", "push", "reverse", "shift", "sort", "splice", "unshift",] as const;
declare namespace createArray { export type Extensions<T> = [ {}, { at(index: number, value: T): T; find(predicate: (item: T) => boolean, value: T): T | undefined; } & NativeMutators<T[], typeof arrayMutators[number]> ]; export type Type<T, Base extends [{}, {}] = [{}, {}]> = createSignal.Extended< T[], Base & Extensions<T> >;
export type Result<T, Base extends [{}, {}] = [{}, {}]> = ReturnType< Type<T, Base> >;}
function createArray<T>(value: T[], options?: SignalOptions<T[]>) { return createArray.wrap(createSignal(value, options));}
createArray.wrap = <Sig extends Signal<any[]>>(signal: Sig) => { type T = Sig extends Signal<infer T> ? T extends any[] ? T[number] : never : never;
return signalExtender(signal).extend<createArray.Extensions<T>>( ([state, setState]) => [ {}, { at(index: number, value: T) { const s = state(); setState([ ...s.slice(0, index), value, ...s.slice( // If index is -1, array proceeding value should be empty, value // being set will be last item index + 1 || s.length ), ]);
return value; }, find(predicate: (item: T) => boolean, value: T) { const index = state().findIndex(predicate);
if (index === -1) return;
setState.at(index, value);
return state()[index]; }, ...getNativeExtensions(() => [...state()], setState, arrayMutators), }, ] );};
export default createArray;
Version Info