deno.land / x / solid_signals@solid-signals@1.3.7 / src / signals / composable / createArray / createArray.ts

createArray.ts
نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { 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;
solid_signals

Version Info

Tagged at
2 years ago