@sergeydus/ng-signals-utils 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -89,7 +89,8 @@ const completedTodos = arraySignalFilter(allTodos, todo => todo.completed);
89
89
  ### Real-time Search with Debouncing
90
90
 
91
91
  ```typescript
92
- import { Component, signal } from '@angular/core';
92
+ import { Component, signal, effect, inject } from '@angular/core';
93
+ import { HttpClient } from '@angular/common/http';
93
94
  import { debounceSignal } from '@sergeydus/ng-signals-utils';
94
95
 
95
96
  @Component({
@@ -100,6 +101,8 @@ import { debounceSignal } from '@sergeydus/ng-signals-utils';
100
101
  `
101
102
  })
102
103
  export class SearchComponent {
104
+ private http = inject(HttpClient);
105
+
103
106
  searchTerm = signal('');
104
107
  debouncedSearch = debounceSignal(this.searchTerm, 300);
105
108
 
@@ -110,6 +113,18 @@ export class SearchComponent {
110
113
  if (query) this.searchAPI(query);
111
114
  });
112
115
  }
116
+
117
+ onSearch(event: Event) {
118
+ const value = (event.target as HTMLInputElement).value;
119
+ this.searchTerm.set(value);
120
+ }
121
+
122
+ searchAPI(query: string) {
123
+ this.http.get(`/api/search?q=${query}`).subscribe(results => {
124
+ console.log('Search results:', results);
125
+ // Handle your search results here
126
+ });
127
+ }
113
128
  }
114
129
  ```
115
130
 
@@ -167,12 +182,10 @@ export class CheckoutComponent {
167
182
  shipping = signal(10);
168
183
 
169
184
  // Automatically recalculates when any signal changes
185
+ combined = combineSignals([this.items, this.tax, this.shipping]);
186
+
170
187
  orderSummary = computed(() => {
171
- const [itemList, taxRate, shippingCost] = combineSignals([
172
- this.items,
173
- this.tax,
174
- this.shipping
175
- ])();
188
+ const [itemList, taxRate, shippingCost] = this.combined();
176
189
 
177
190
  const subtotal = itemList.reduce((sum, item) => sum + item.price, 0);
178
191
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sergeydus/ng-signals-utils",
3
- "version": "0.0.6",
3
+ "version": "0.0.7",
4
4
  "description": "Utility functions for Angular signals",
5
5
  "keywords": [
6
6
  "angular",
@@ -1,303 +0,0 @@
1
- import { computed, signal, effect } from '@angular/core';
2
-
3
- /**
4
- * Maps a signal value to another type
5
- * @param source - Source signal
6
- * @param fn - Mapping function
7
- * @returns Computed signal with mapped value
8
- */
9
- function mapSignal(source, fn) {
10
- return computed(() => fn(source()));
11
- }
12
- /**
13
- * Filters signal updates based on a predicate
14
- * @param source - Source signal
15
- * @param predicate - Filter predicate
16
- * @param initialValue - Initial value to use if predicate fails
17
- * @returns Signal that only updates when predicate returns true
18
- */
19
- function filterSignal(source, predicate, initialValue) {
20
- const filtered = signal(initialValue, ...(ngDevMode ? [{ debugName: "filtered" }] : []));
21
- effect(() => {
22
- const value = source();
23
- if (predicate(value)) {
24
- filtered.set(value);
25
- }
26
- });
27
- return filtered.asReadonly();
28
- }
29
- /**
30
- * Debounces signal updates
31
- * @param source - Source signal
32
- * @param ms - Debounce delay in milliseconds
33
- * @returns Debounced signal
34
- */
35
- function debounceSignal(source, ms) {
36
- const debounced = signal(source(), ...(ngDevMode ? [{ debugName: "debounced" }] : []));
37
- let timeoutId;
38
- effect(() => {
39
- const value = source();
40
- clearTimeout(timeoutId);
41
- timeoutId = setTimeout(() => {
42
- debounced.set(value);
43
- }, ms);
44
- });
45
- return debounced.asReadonly();
46
- }
47
- /**
48
- * Combines multiple signals into a single signal
49
- * @param signals - Array of signals to combine
50
- * @returns Combined signal with array of values
51
- */
52
- function combineSignals(signals) {
53
- return computed(() => signals.map(s => s()));
54
- }
55
- /**
56
- * Creates a signal that emits distinct values only
57
- * @param source - Source signal
58
- * @param compareFn - Optional comparison function
59
- * @returns Signal that only updates on distinct values
60
- */
61
- function distinctSignal(source, compareFn = (a, b) => a === b) {
62
- const distinct = signal(source(), ...(ngDevMode ? [{ debugName: "distinct" }] : []));
63
- let lastValue = source();
64
- effect(() => {
65
- const value = source();
66
- if (!compareFn(value, lastValue)) {
67
- lastValue = value;
68
- distinct.set(value);
69
- }
70
- });
71
- return distinct.asReadonly();
72
- }
73
-
74
- /**
75
- * Pushes an item to an array signal
76
- * @param arraySignal - Writable array signal
77
- * @param item - Item to push
78
- */
79
- function arraySignalPush(arraySignal, item) {
80
- arraySignal.update(arr => [...arr, item]);
81
- }
82
- /**
83
- * Removes an item from an array signal at the specified index
84
- * @param arraySignal - Writable array signal
85
- * @param index - Index to remove
86
- */
87
- function arraySignalRemoveAt(arraySignal, index) {
88
- arraySignal.update(arr => arr.filter((_, i) => i !== index));
89
- }
90
- /**
91
- * Filters an array signal
92
- * @param arraySignal - Array signal
93
- * @param predicate - Filter predicate
94
- * @returns Computed signal with filtered array
95
- */
96
- function arraySignalFilter(arraySignal, predicate) {
97
- return computed(() => arraySignal().filter(predicate));
98
- }
99
- /**
100
- * Maps an array signal
101
- * @param arraySignal - Array signal
102
- * @param fn - Mapping function
103
- * @returns Computed signal with mapped array
104
- */
105
- function arraySignalMap(arraySignal, fn) {
106
- return computed(() => arraySignal().map(fn));
107
- }
108
- /**
109
- * Sorts an array signal
110
- * @param arraySignal - Array signal
111
- * @param compareFn - Optional comparison function
112
- * @returns Computed signal with sorted array
113
- */
114
- function arraySignalSort(arraySignal, compareFn) {
115
- return computed(() => [...arraySignal()].sort(compareFn));
116
- }
117
- /**
118
- * Finds an item in an array signal
119
- * @param arraySignal - Array signal
120
- * @param predicate - Find predicate
121
- * @returns Computed signal with found item or undefined
122
- */
123
- function arraySignalFind(arraySignal, predicate) {
124
- return computed(() => arraySignal().find(predicate));
125
- }
126
- /**
127
- * Gets the length of an array signal
128
- * @param arraySignal - Array signal
129
- * @returns Computed signal with array length
130
- */
131
- function arraySignalLength(arraySignal) {
132
- return computed(() => arraySignal().length);
133
- }
134
- /**
135
- * Checks if an array signal is empty
136
- * @param arraySignal - Array signal
137
- * @returns Computed signal indicating if array is empty
138
- */
139
- function arraySignalIsEmpty(arraySignal) {
140
- return computed(() => arraySignal().length === 0);
141
- }
142
-
143
- /**
144
- * Patches an object signal with partial values
145
- * @param objectSignal - Writable object signal
146
- * @param partial - Partial object to merge
147
- */
148
- function patchSignal(objectSignal, partial) {
149
- objectSignal.update(obj => ({ ...obj, ...partial }));
150
- }
151
- /**
152
- * Picks specific keys from an object signal
153
- * @param objectSignal - Object signal
154
- * @param keys - Keys to pick
155
- * @returns Computed signal with picked keys
156
- */
157
- function pickSignal(objectSignal, ...keys) {
158
- return computed(() => {
159
- const obj = objectSignal();
160
- const result = {};
161
- for (const key of keys) {
162
- result[key] = obj[key];
163
- }
164
- return result;
165
- });
166
- }
167
- /**
168
- * Omits specific keys from an object signal
169
- * @param objectSignal - Object signal
170
- * @param keys - Keys to omit
171
- * @returns Computed signal with omitted keys
172
- */
173
- function omitSignal(objectSignal, ...keys) {
174
- return computed(() => {
175
- const obj = objectSignal();
176
- const result = { ...obj };
177
- for (const key of keys) {
178
- delete result[key];
179
- }
180
- return result;
181
- });
182
- }
183
- /**
184
- * Gets a property value from an object signal
185
- * @param objectSignal - Object signal
186
- * @param key - Property key
187
- * @returns Computed signal with property value
188
- */
189
- function pluckSignal(objectSignal, key) {
190
- return computed(() => objectSignal()[key]);
191
- }
192
- /**
193
- * Gets the keys of an object signal
194
- * @param objectSignal - Object signal
195
- * @returns Computed signal with object keys
196
- */
197
- function objectSignalKeys(objectSignal) {
198
- return computed(() => Object.keys(objectSignal()));
199
- }
200
- /**
201
- * Gets the values of an object signal
202
- * @param objectSignal - Object signal
203
- * @returns Computed signal with object values
204
- */
205
- function objectSignalValues(objectSignal) {
206
- return computed(() => Object.values(objectSignal()));
207
- }
208
- /**
209
- * Gets the entries of an object signal
210
- * @param objectSignal - Object signal
211
- * @returns Computed signal with object entries
212
- */
213
- function objectSignalEntries(objectSignal) {
214
- return computed(() => Object.entries(objectSignal()));
215
- }
216
-
217
- /**
218
- * Creates an effect that runs only when the signal value changes
219
- * @param source - Source signal to watch
220
- * @param fn - Effect function
221
- * @param options - Effect options
222
- * @returns EffectRef
223
- */
224
- function watchSignal(source, fn, options) {
225
- let previousValue = undefined;
226
- let isFirst = true;
227
- return effect(() => {
228
- const value = source();
229
- if (!isFirst) {
230
- fn(value, previousValue);
231
- }
232
- previousValue = value;
233
- isFirst = false;
234
- }, options);
235
- }
236
- /**
237
- * Creates an effect that runs once when the signal meets a condition
238
- * @param source - Source signal to watch
239
- * @param predicate - Condition to check
240
- * @param fn - Effect function
241
- * @param options - Effect options
242
- * @returns EffectRef
243
- */
244
- function watchUntil(source, predicate, fn, options) {
245
- let hasRun = false;
246
- const effectRef = effect(() => {
247
- if (hasRun)
248
- return;
249
- const value = source();
250
- if (predicate(value)) {
251
- fn(value);
252
- hasRun = true;
253
- effectRef.destroy();
254
- }
255
- }, options);
256
- return effectRef;
257
- }
258
- /**
259
- * Creates a throttled effect
260
- * @param source - Source signal to watch
261
- * @param fn - Effect function
262
- * @param ms - Throttle delay in milliseconds
263
- * @param options - Effect options
264
- * @returns EffectRef
265
- */
266
- function throttleEffect(source, fn, ms, options) {
267
- let lastRun = 0;
268
- return effect(() => {
269
- const value = source();
270
- const now = Date.now();
271
- if (now - lastRun >= ms) {
272
- fn(value);
273
- lastRun = now;
274
- }
275
- }, options);
276
- }
277
- /**
278
- * Creates a debounced effect
279
- * @param source - Source signal to watch
280
- * @param fn - Effect function
281
- * @param ms - Debounce delay in milliseconds
282
- * @param options - Effect options
283
- * @returns EffectRef
284
- */
285
- function debounceEffect(source, fn, ms, options) {
286
- let timeoutId;
287
- return effect(() => {
288
- const value = source();
289
- clearTimeout(timeoutId);
290
- timeoutId = setTimeout(() => fn(value), ms);
291
- }, options);
292
- }
293
-
294
- /*
295
- * Public API Surface of ng-signals-utils
296
- */
297
-
298
- /**
299
- * Generated bundle index. Do not edit.
300
- */
301
-
302
- export { arraySignalFilter, arraySignalFind, arraySignalIsEmpty, arraySignalLength, arraySignalMap, arraySignalPush, arraySignalRemoveAt, arraySignalSort, combineSignals, debounceEffect, debounceSignal, distinctSignal, filterSignal, mapSignal, objectSignalEntries, objectSignalKeys, objectSignalValues, omitSignal, patchSignal, pickSignal, pluckSignal, throttleEffect, watchSignal, watchUntil };
303
- //# sourceMappingURL=ng-signals-utils.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ng-signals-utils.mjs","sources":["../../../projects/ng-signals-utils/src/lib/signal-transformations.ts","../../../projects/ng-signals-utils/src/lib/signal-array-utils.ts","../../../projects/ng-signals-utils/src/lib/signal-object-utils.ts","../../../projects/ng-signals-utils/src/lib/signal-effect-utils.ts","../../../projects/ng-signals-utils/src/public-api.ts","../../../projects/ng-signals-utils/src/ng-signals-utils.ts"],"sourcesContent":["import { Signal, computed, signal, WritableSignal, effect } from '@angular/core';\r\n\r\n/**\r\n * Maps a signal value to another type\r\n * @param source - Source signal\r\n * @param fn - Mapping function\r\n * @returns Computed signal with mapped value\r\n */\r\nexport function mapSignal<T, R>(\r\n source: Signal<T>,\r\n fn: (value: T) => R\r\n): Signal<R> {\r\n return computed(() => fn(source()));\r\n}\r\n\r\n/**\r\n * Filters signal updates based on a predicate\r\n * @param source - Source signal\r\n * @param predicate - Filter predicate\r\n * @param initialValue - Initial value to use if predicate fails\r\n * @returns Signal that only updates when predicate returns true\r\n */\r\nexport function filterSignal<T>(\r\n source: Signal<T>,\r\n predicate: (value: T) => boolean,\r\n initialValue: T\r\n): Signal<T> {\r\n const filtered = signal(initialValue);\r\n \r\n effect(() => {\r\n const value = source();\r\n if (predicate(value)) {\r\n (filtered as WritableSignal<T>).set(value);\r\n }\r\n });\r\n \r\n return filtered.asReadonly();\r\n}\r\n\r\n/**\r\n * Debounces signal updates\r\n * @param source - Source signal\r\n * @param ms - Debounce delay in milliseconds\r\n * @returns Debounced signal\r\n */\r\nexport function debounceSignal<T>(\r\n source: Signal<T>,\r\n ms: number\r\n): Signal<T> {\r\n const debounced = signal(source());\r\n let timeoutId: any;\r\n \r\n effect(() => {\r\n const value = source();\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => {\r\n (debounced as WritableSignal<T>).set(value);\r\n }, ms);\r\n });\r\n \r\n return debounced.asReadonly();\r\n}\r\n\r\n/**\r\n * Combines multiple signals into a single signal\r\n * @param signals - Array of signals to combine\r\n * @returns Combined signal with array of values\r\n */\r\nexport function combineSignals<T extends readonly Signal<any>[]>(\r\n signals: T\r\n): Signal<{ [K in keyof T]: T[K] extends Signal<infer U> ? U : never }> {\r\n return computed(() => signals.map(s => s()) as any);\r\n}\r\n\r\n/**\r\n * Creates a signal that emits distinct values only\r\n * @param source - Source signal\r\n * @param compareFn - Optional comparison function\r\n * @returns Signal that only updates on distinct values\r\n */\r\nexport function distinctSignal<T>(\r\n source: Signal<T>,\r\n compareFn: (a: T, b: T) => boolean = (a, b) => a === b\r\n): Signal<T> {\r\n const distinct = signal(source());\r\n let lastValue = source();\r\n \r\n effect(() => {\r\n const value = source();\r\n if (!compareFn(value, lastValue)) {\r\n lastValue = value;\r\n (distinct as WritableSignal<T>).set(value);\r\n }\r\n });\r\n \r\n return distinct.asReadonly();\r\n}\r\n","import { Signal, WritableSignal, computed } from '@angular/core';\r\n\r\n/**\r\n * Pushes an item to an array signal\r\n * @param arraySignal - Writable array signal\r\n * @param item - Item to push\r\n */\r\nexport function arraySignalPush<T>(\r\n arraySignal: WritableSignal<T[]>,\r\n item: T\r\n): void {\r\n arraySignal.update(arr => [...arr, item]);\r\n}\r\n\r\n/**\r\n * Removes an item from an array signal at the specified index\r\n * @param arraySignal - Writable array signal\r\n * @param index - Index to remove\r\n */\r\nexport function arraySignalRemoveAt<T>(\r\n arraySignal: WritableSignal<T[]>,\r\n index: number\r\n): void {\r\n arraySignal.update(arr => arr.filter((_, i) => i !== index));\r\n}\r\n\r\n/**\r\n * Filters an array signal\r\n * @param arraySignal - Array signal\r\n * @param predicate - Filter predicate\r\n * @returns Computed signal with filtered array\r\n */\r\nexport function arraySignalFilter<T>(\r\n arraySignal: Signal<T[]>,\r\n predicate: (item: T, index: number) => boolean\r\n): Signal<T[]> {\r\n return computed(() => arraySignal().filter(predicate));\r\n}\r\n\r\n/**\r\n * Maps an array signal\r\n * @param arraySignal - Array signal\r\n * @param fn - Mapping function\r\n * @returns Computed signal with mapped array\r\n */\r\nexport function arraySignalMap<T, R>(\r\n arraySignal: Signal<T[]>,\r\n fn: (item: T, index: number) => R\r\n): Signal<R[]> {\r\n return computed(() => arraySignal().map(fn));\r\n}\r\n\r\n/**\r\n * Sorts an array signal\r\n * @param arraySignal - Array signal\r\n * @param compareFn - Optional comparison function\r\n * @returns Computed signal with sorted array\r\n */\r\nexport function arraySignalSort<T>(\r\n arraySignal: Signal<T[]>,\r\n compareFn?: (a: T, b: T) => number\r\n): Signal<T[]> {\r\n return computed(() => [...arraySignal()].sort(compareFn));\r\n}\r\n\r\n/**\r\n * Finds an item in an array signal\r\n * @param arraySignal - Array signal\r\n * @param predicate - Find predicate\r\n * @returns Computed signal with found item or undefined\r\n */\r\nexport function arraySignalFind<T>(\r\n arraySignal: Signal<T[]>,\r\n predicate: (item: T, index: number) => boolean\r\n): Signal<T | undefined> {\r\n return computed(() => arraySignal().find(predicate));\r\n}\r\n\r\n/**\r\n * Gets the length of an array signal\r\n * @param arraySignal - Array signal\r\n * @returns Computed signal with array length\r\n */\r\nexport function arraySignalLength<T>(\r\n arraySignal: Signal<T[]>\r\n): Signal<number> {\r\n return computed(() => arraySignal().length);\r\n}\r\n\r\n/**\r\n * Checks if an array signal is empty\r\n * @param arraySignal - Array signal\r\n * @returns Computed signal indicating if array is empty\r\n */\r\nexport function arraySignalIsEmpty<T>(\r\n arraySignal: Signal<T[]>\r\n): Signal<boolean> {\r\n return computed(() => arraySignal().length === 0);\r\n}\r\n","import { Signal, WritableSignal, computed } from '@angular/core';\r\n\r\n/**\r\n * Patches an object signal with partial values\r\n * @param objectSignal - Writable object signal\r\n * @param partial - Partial object to merge\r\n */\r\nexport function patchSignal<T extends object>(\r\n objectSignal: WritableSignal<T>,\r\n partial: Partial<T>\r\n): void {\r\n objectSignal.update(obj => ({ ...obj, ...partial }));\r\n}\r\n\r\n/**\r\n * Picks specific keys from an object signal\r\n * @param objectSignal - Object signal\r\n * @param keys - Keys to pick\r\n * @returns Computed signal with picked keys\r\n */\r\nexport function pickSignal<T extends object, K extends keyof T>(\r\n objectSignal: Signal<T>,\r\n ...keys: K[]\r\n): Signal<Pick<T, K>> {\r\n return computed(() => {\r\n const obj = objectSignal();\r\n const result = {} as Pick<T, K>;\r\n for (const key of keys) {\r\n result[key] = obj[key];\r\n }\r\n return result;\r\n });\r\n}\r\n\r\n/**\r\n * Omits specific keys from an object signal\r\n * @param objectSignal - Object signal\r\n * @param keys - Keys to omit\r\n * @returns Computed signal with omitted keys\r\n */\r\nexport function omitSignal<T extends object, K extends keyof T>(\r\n objectSignal: Signal<T>,\r\n ...keys: K[]\r\n): Signal<Omit<T, K>> {\r\n return computed(() => {\r\n const obj = objectSignal();\r\n const result = { ...obj } as any;\r\n for (const key of keys) {\r\n delete result[key];\r\n }\r\n return result;\r\n });\r\n}\r\n\r\n/**\r\n * Gets a property value from an object signal\r\n * @param objectSignal - Object signal\r\n * @param key - Property key\r\n * @returns Computed signal with property value\r\n */\r\nexport function pluckSignal<T extends object, K extends keyof T>(\r\n objectSignal: Signal<T>,\r\n key: K\r\n): Signal<T[K]> {\r\n return computed(() => objectSignal()[key]);\r\n}\r\n\r\n/**\r\n * Gets the keys of an object signal\r\n * @param objectSignal - Object signal\r\n * @returns Computed signal with object keys\r\n */\r\nexport function objectSignalKeys<T extends object>(\r\n objectSignal: Signal<T>\r\n): Signal<(keyof T)[]> {\r\n return computed(() => Object.keys(objectSignal()) as (keyof T)[]);\r\n}\r\n\r\n/**\r\n * Gets the values of an object signal\r\n * @param objectSignal - Object signal\r\n * @returns Computed signal with object values\r\n */\r\nexport function objectSignalValues<T extends object>(\r\n objectSignal: Signal<T>\r\n): Signal<T[keyof T][]> {\r\n return computed(() => Object.values(objectSignal()) as T[keyof T][]);\r\n}\r\n\r\n/**\r\n * Gets the entries of an object signal\r\n * @param objectSignal - Object signal\r\n * @returns Computed signal with object entries\r\n */\r\nexport function objectSignalEntries<T extends object>(\r\n objectSignal: Signal<T>\r\n): Signal<[keyof T, T[keyof T]][]> {\r\n return computed(() => Object.entries(objectSignal()) as [keyof T, T[keyof T]][]);\r\n}\r\n","import { Signal, effect, EffectRef, CreateEffectOptions } from '@angular/core';\r\n\r\n/**\r\n * Creates an effect that runs only when the signal value changes\r\n * @param source - Source signal to watch\r\n * @param fn - Effect function\r\n * @param options - Effect options\r\n * @returns EffectRef\r\n */\r\nexport function watchSignal<T>(\r\n source: Signal<T>,\r\n fn: (value: T, previousValue: T | undefined) => void,\r\n options?: CreateEffectOptions\r\n): EffectRef {\r\n let previousValue: T | undefined = undefined;\r\n let isFirst = true;\r\n \r\n return effect(() => {\r\n const value = source();\r\n if (!isFirst) {\r\n fn(value, previousValue);\r\n }\r\n previousValue = value;\r\n isFirst = false;\r\n }, options);\r\n}\r\n\r\n/**\r\n * Creates an effect that runs once when the signal meets a condition\r\n * @param source - Source signal to watch\r\n * @param predicate - Condition to check\r\n * @param fn - Effect function\r\n * @param options - Effect options\r\n * @returns EffectRef\r\n */\r\nexport function watchUntil<T>(\r\n source: Signal<T>,\r\n predicate: (value: T) => boolean,\r\n fn: (value: T) => void,\r\n options?: CreateEffectOptions\r\n): EffectRef {\r\n let hasRun = false;\r\n \r\n const effectRef = effect(() => {\r\n if (hasRun) return;\r\n \r\n const value = source();\r\n if (predicate(value)) {\r\n fn(value);\r\n hasRun = true;\r\n effectRef.destroy();\r\n }\r\n }, options);\r\n \r\n return effectRef;\r\n}\r\n\r\n/**\r\n * Creates a throttled effect\r\n * @param source - Source signal to watch\r\n * @param fn - Effect function\r\n * @param ms - Throttle delay in milliseconds\r\n * @param options - Effect options\r\n * @returns EffectRef\r\n */\r\nexport function throttleEffect<T>(\r\n source: Signal<T>,\r\n fn: (value: T) => void,\r\n ms: number,\r\n options?: CreateEffectOptions\r\n): EffectRef {\r\n let lastRun = 0;\r\n \r\n return effect(() => {\r\n const value = source();\r\n const now = Date.now();\r\n \r\n if (now - lastRun >= ms) {\r\n fn(value);\r\n lastRun = now;\r\n }\r\n }, options);\r\n}\r\n\r\n/**\r\n * Creates a debounced effect\r\n * @param source - Source signal to watch\r\n * @param fn - Effect function\r\n * @param ms - Debounce delay in milliseconds\r\n * @param options - Effect options\r\n * @returns EffectRef\r\n */\r\nexport function debounceEffect<T>(\r\n source: Signal<T>,\r\n fn: (value: T) => void,\r\n ms: number,\r\n options?: CreateEffectOptions\r\n): EffectRef {\r\n let timeoutId: any;\r\n \r\n return effect(() => {\r\n const value = source();\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(() => fn(value), ms);\r\n }, options);\r\n}\r\n","/*\r\n * Public API Surface of ng-signals-utils\r\n */\r\n\r\nexport * from './lib/signal-transformations';\r\nexport * from './lib/signal-array-utils';\r\nexport * from './lib/signal-object-utils';\r\nexport * from './lib/signal-effect-utils';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,176 +0,0 @@
1
- import { Signal, WritableSignal, CreateEffectOptions, EffectRef } from '@angular/core';
2
-
3
- /**
4
- * Maps a signal value to another type
5
- * @param source - Source signal
6
- * @param fn - Mapping function
7
- * @returns Computed signal with mapped value
8
- */
9
- declare function mapSignal<T, R>(source: Signal<T>, fn: (value: T) => R): Signal<R>;
10
- /**
11
- * Filters signal updates based on a predicate
12
- * @param source - Source signal
13
- * @param predicate - Filter predicate
14
- * @param initialValue - Initial value to use if predicate fails
15
- * @returns Signal that only updates when predicate returns true
16
- */
17
- declare function filterSignal<T>(source: Signal<T>, predicate: (value: T) => boolean, initialValue: T): Signal<T>;
18
- /**
19
- * Debounces signal updates
20
- * @param source - Source signal
21
- * @param ms - Debounce delay in milliseconds
22
- * @returns Debounced signal
23
- */
24
- declare function debounceSignal<T>(source: Signal<T>, ms: number): Signal<T>;
25
- /**
26
- * Combines multiple signals into a single signal
27
- * @param signals - Array of signals to combine
28
- * @returns Combined signal with array of values
29
- */
30
- declare function combineSignals<T extends readonly Signal<any>[]>(signals: T): Signal<{
31
- [K in keyof T]: T[K] extends Signal<infer U> ? U : never;
32
- }>;
33
- /**
34
- * Creates a signal that emits distinct values only
35
- * @param source - Source signal
36
- * @param compareFn - Optional comparison function
37
- * @returns Signal that only updates on distinct values
38
- */
39
- declare function distinctSignal<T>(source: Signal<T>, compareFn?: (a: T, b: T) => boolean): Signal<T>;
40
-
41
- /**
42
- * Pushes an item to an array signal
43
- * @param arraySignal - Writable array signal
44
- * @param item - Item to push
45
- */
46
- declare function arraySignalPush<T>(arraySignal: WritableSignal<T[]>, item: T): void;
47
- /**
48
- * Removes an item from an array signal at the specified index
49
- * @param arraySignal - Writable array signal
50
- * @param index - Index to remove
51
- */
52
- declare function arraySignalRemoveAt<T>(arraySignal: WritableSignal<T[]>, index: number): void;
53
- /**
54
- * Filters an array signal
55
- * @param arraySignal - Array signal
56
- * @param predicate - Filter predicate
57
- * @returns Computed signal with filtered array
58
- */
59
- declare function arraySignalFilter<T>(arraySignal: Signal<T[]>, predicate: (item: T, index: number) => boolean): Signal<T[]>;
60
- /**
61
- * Maps an array signal
62
- * @param arraySignal - Array signal
63
- * @param fn - Mapping function
64
- * @returns Computed signal with mapped array
65
- */
66
- declare function arraySignalMap<T, R>(arraySignal: Signal<T[]>, fn: (item: T, index: number) => R): Signal<R[]>;
67
- /**
68
- * Sorts an array signal
69
- * @param arraySignal - Array signal
70
- * @param compareFn - Optional comparison function
71
- * @returns Computed signal with sorted array
72
- */
73
- declare function arraySignalSort<T>(arraySignal: Signal<T[]>, compareFn?: (a: T, b: T) => number): Signal<T[]>;
74
- /**
75
- * Finds an item in an array signal
76
- * @param arraySignal - Array signal
77
- * @param predicate - Find predicate
78
- * @returns Computed signal with found item or undefined
79
- */
80
- declare function arraySignalFind<T>(arraySignal: Signal<T[]>, predicate: (item: T, index: number) => boolean): Signal<T | undefined>;
81
- /**
82
- * Gets the length of an array signal
83
- * @param arraySignal - Array signal
84
- * @returns Computed signal with array length
85
- */
86
- declare function arraySignalLength<T>(arraySignal: Signal<T[]>): Signal<number>;
87
- /**
88
- * Checks if an array signal is empty
89
- * @param arraySignal - Array signal
90
- * @returns Computed signal indicating if array is empty
91
- */
92
- declare function arraySignalIsEmpty<T>(arraySignal: Signal<T[]>): Signal<boolean>;
93
-
94
- /**
95
- * Patches an object signal with partial values
96
- * @param objectSignal - Writable object signal
97
- * @param partial - Partial object to merge
98
- */
99
- declare function patchSignal<T extends object>(objectSignal: WritableSignal<T>, partial: Partial<T>): void;
100
- /**
101
- * Picks specific keys from an object signal
102
- * @param objectSignal - Object signal
103
- * @param keys - Keys to pick
104
- * @returns Computed signal with picked keys
105
- */
106
- declare function pickSignal<T extends object, K extends keyof T>(objectSignal: Signal<T>, ...keys: K[]): Signal<Pick<T, K>>;
107
- /**
108
- * Omits specific keys from an object signal
109
- * @param objectSignal - Object signal
110
- * @param keys - Keys to omit
111
- * @returns Computed signal with omitted keys
112
- */
113
- declare function omitSignal<T extends object, K extends keyof T>(objectSignal: Signal<T>, ...keys: K[]): Signal<Omit<T, K>>;
114
- /**
115
- * Gets a property value from an object signal
116
- * @param objectSignal - Object signal
117
- * @param key - Property key
118
- * @returns Computed signal with property value
119
- */
120
- declare function pluckSignal<T extends object, K extends keyof T>(objectSignal: Signal<T>, key: K): Signal<T[K]>;
121
- /**
122
- * Gets the keys of an object signal
123
- * @param objectSignal - Object signal
124
- * @returns Computed signal with object keys
125
- */
126
- declare function objectSignalKeys<T extends object>(objectSignal: Signal<T>): Signal<(keyof T)[]>;
127
- /**
128
- * Gets the values of an object signal
129
- * @param objectSignal - Object signal
130
- * @returns Computed signal with object values
131
- */
132
- declare function objectSignalValues<T extends object>(objectSignal: Signal<T>): Signal<T[keyof T][]>;
133
- /**
134
- * Gets the entries of an object signal
135
- * @param objectSignal - Object signal
136
- * @returns Computed signal with object entries
137
- */
138
- declare function objectSignalEntries<T extends object>(objectSignal: Signal<T>): Signal<[keyof T, T[keyof T]][]>;
139
-
140
- /**
141
- * Creates an effect that runs only when the signal value changes
142
- * @param source - Source signal to watch
143
- * @param fn - Effect function
144
- * @param options - Effect options
145
- * @returns EffectRef
146
- */
147
- declare function watchSignal<T>(source: Signal<T>, fn: (value: T, previousValue: T | undefined) => void, options?: CreateEffectOptions): EffectRef;
148
- /**
149
- * Creates an effect that runs once when the signal meets a condition
150
- * @param source - Source signal to watch
151
- * @param predicate - Condition to check
152
- * @param fn - Effect function
153
- * @param options - Effect options
154
- * @returns EffectRef
155
- */
156
- declare function watchUntil<T>(source: Signal<T>, predicate: (value: T) => boolean, fn: (value: T) => void, options?: CreateEffectOptions): EffectRef;
157
- /**
158
- * Creates a throttled effect
159
- * @param source - Source signal to watch
160
- * @param fn - Effect function
161
- * @param ms - Throttle delay in milliseconds
162
- * @param options - Effect options
163
- * @returns EffectRef
164
- */
165
- declare function throttleEffect<T>(source: Signal<T>, fn: (value: T) => void, ms: number, options?: CreateEffectOptions): EffectRef;
166
- /**
167
- * Creates a debounced effect
168
- * @param source - Source signal to watch
169
- * @param fn - Effect function
170
- * @param ms - Debounce delay in milliseconds
171
- * @param options - Effect options
172
- * @returns EffectRef
173
- */
174
- declare function debounceEffect<T>(source: Signal<T>, fn: (value: T) => void, ms: number, options?: CreateEffectOptions): EffectRef;
175
-
176
- export { arraySignalFilter, arraySignalFind, arraySignalIsEmpty, arraySignalLength, arraySignalMap, arraySignalPush, arraySignalRemoveAt, arraySignalSort, combineSignals, debounceEffect, debounceSignal, distinctSignal, filterSignal, mapSignal, objectSignalEntries, objectSignalKeys, objectSignalValues, omitSignal, patchSignal, pickSignal, pluckSignal, throttleEffect, watchSignal, watchUntil };