@tanstack/solid-pacer 0.8.0 → 0.9.1

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.
Files changed (132) hide show
  1. package/dist/cjs/async-batcher/createAsyncBatcher.cjs +14 -0
  2. package/dist/cjs/async-batcher/createAsyncBatcher.cjs.map +1 -0
  3. package/dist/cjs/async-batcher/createAsyncBatcher.d.cts +72 -0
  4. package/dist/cjs/async-batcher/index.cjs +12 -0
  5. package/dist/cjs/{compare → async-batcher}/index.cjs.map +1 -1
  6. package/dist/cjs/async-batcher/index.d.cts +2 -0
  7. package/dist/cjs/async-debouncer/createAsyncDebouncer.cjs +9 -36
  8. package/dist/cjs/async-debouncer/createAsyncDebouncer.cjs.map +1 -1
  9. package/dist/cjs/async-debouncer/createAsyncDebouncer.d.cts +10 -9
  10. package/dist/cjs/async-queuer/createAsyncQueuer.cjs +5 -73
  11. package/dist/cjs/async-queuer/createAsyncQueuer.cjs.map +1 -1
  12. package/dist/cjs/async-queuer/createAsyncQueuer.d.cts +7 -53
  13. package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.cjs +5 -52
  14. package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.cjs.map +1 -1
  15. package/dist/cjs/async-rate-limiter/createAsyncRateLimiter.d.cts +4 -9
  16. package/dist/cjs/async-throttler/createAsyncThrottler.cjs +5 -55
  17. package/dist/cjs/async-throttler/createAsyncThrottler.cjs.map +1 -1
  18. package/dist/cjs/async-throttler/createAsyncThrottler.d.cts +9 -11
  19. package/dist/cjs/batcher/createBatcher.cjs +5 -49
  20. package/dist/cjs/batcher/createBatcher.cjs.map +1 -1
  21. package/dist/cjs/batcher/createBatcher.d.cts +9 -27
  22. package/dist/cjs/debouncer/createDebouncedSignal.cjs +2 -2
  23. package/dist/cjs/debouncer/createDebouncedSignal.cjs.map +1 -1
  24. package/dist/cjs/debouncer/createDebouncedSignal.d.cts +6 -2
  25. package/dist/cjs/debouncer/createDebouncedValue.cjs +3 -2
  26. package/dist/cjs/debouncer/createDebouncedValue.cjs.map +1 -1
  27. package/dist/cjs/debouncer/createDebouncedValue.d.cts +2 -2
  28. package/dist/cjs/debouncer/createDebouncer.cjs +7 -24
  29. package/dist/cjs/debouncer/createDebouncer.cjs.map +1 -1
  30. package/dist/cjs/debouncer/createDebouncer.d.cts +9 -8
  31. package/dist/cjs/index.cjs +2 -0
  32. package/dist/cjs/index.cjs.map +1 -1
  33. package/dist/cjs/index.d.cts +1 -0
  34. package/dist/cjs/queuer/createQueuer.cjs +5 -59
  35. package/dist/cjs/queuer/createQueuer.cjs.map +1 -1
  36. package/dist/cjs/queuer/createQueuer.d.cts +7 -37
  37. package/dist/cjs/rate-limiter/createRateLimitedSignal.cjs +7 -3
  38. package/dist/cjs/rate-limiter/createRateLimitedSignal.cjs.map +1 -1
  39. package/dist/cjs/rate-limiter/createRateLimitedSignal.d.cts +6 -2
  40. package/dist/cjs/rate-limiter/createRateLimitedValue.cjs +2 -2
  41. package/dist/cjs/rate-limiter/createRateLimitedValue.cjs.map +1 -1
  42. package/dist/cjs/rate-limiter/createRateLimitedValue.d.cts +2 -2
  43. package/dist/cjs/rate-limiter/createRateLimiter.cjs +5 -43
  44. package/dist/cjs/rate-limiter/createRateLimiter.cjs.map +1 -1
  45. package/dist/cjs/rate-limiter/createRateLimiter.d.cts +9 -7
  46. package/dist/cjs/throttler/createThrottledSignal.cjs +2 -2
  47. package/dist/cjs/throttler/createThrottledSignal.cjs.map +1 -1
  48. package/dist/cjs/throttler/createThrottledSignal.d.cts +6 -2
  49. package/dist/cjs/throttler/createThrottledValue.cjs +3 -2
  50. package/dist/cjs/throttler/createThrottledValue.cjs.map +1 -1
  51. package/dist/cjs/throttler/createThrottledValue.d.cts +2 -2
  52. package/dist/cjs/throttler/createThrottler.cjs +7 -34
  53. package/dist/cjs/throttler/createThrottler.cjs.map +1 -1
  54. package/dist/cjs/throttler/createThrottler.d.cts +9 -10
  55. package/dist/esm/async-batcher/createAsyncBatcher.d.ts +72 -0
  56. package/dist/esm/async-batcher/createAsyncBatcher.js +14 -0
  57. package/dist/esm/async-batcher/createAsyncBatcher.js.map +1 -0
  58. package/dist/esm/async-batcher/index.d.ts +2 -0
  59. package/dist/esm/async-batcher/index.js +6 -0
  60. package/dist/esm/{compare → async-batcher}/index.js.map +1 -1
  61. package/dist/esm/async-debouncer/createAsyncDebouncer.d.ts +10 -9
  62. package/dist/esm/async-debouncer/createAsyncDebouncer.js +10 -37
  63. package/dist/esm/async-debouncer/createAsyncDebouncer.js.map +1 -1
  64. package/dist/esm/async-queuer/createAsyncQueuer.d.ts +7 -53
  65. package/dist/esm/async-queuer/createAsyncQueuer.js +5 -73
  66. package/dist/esm/async-queuer/createAsyncQueuer.js.map +1 -1
  67. package/dist/esm/async-rate-limiter/createAsyncRateLimiter.d.ts +4 -9
  68. package/dist/esm/async-rate-limiter/createAsyncRateLimiter.js +5 -52
  69. package/dist/esm/async-rate-limiter/createAsyncRateLimiter.js.map +1 -1
  70. package/dist/esm/async-throttler/createAsyncThrottler.d.ts +9 -11
  71. package/dist/esm/async-throttler/createAsyncThrottler.js +5 -55
  72. package/dist/esm/async-throttler/createAsyncThrottler.js.map +1 -1
  73. package/dist/esm/batcher/createBatcher.d.ts +9 -27
  74. package/dist/esm/batcher/createBatcher.js +5 -49
  75. package/dist/esm/batcher/createBatcher.js.map +1 -1
  76. package/dist/esm/debouncer/createDebouncedSignal.d.ts +6 -2
  77. package/dist/esm/debouncer/createDebouncedSignal.js +2 -2
  78. package/dist/esm/debouncer/createDebouncedSignal.js.map +1 -1
  79. package/dist/esm/debouncer/createDebouncedValue.d.ts +2 -2
  80. package/dist/esm/debouncer/createDebouncedValue.js +3 -2
  81. package/dist/esm/debouncer/createDebouncedValue.js.map +1 -1
  82. package/dist/esm/debouncer/createDebouncer.d.ts +9 -8
  83. package/dist/esm/debouncer/createDebouncer.js +8 -25
  84. package/dist/esm/debouncer/createDebouncer.js.map +1 -1
  85. package/dist/esm/index.d.ts +1 -0
  86. package/dist/esm/index.js +2 -0
  87. package/dist/esm/index.js.map +1 -1
  88. package/dist/esm/queuer/createQueuer.d.ts +7 -37
  89. package/dist/esm/queuer/createQueuer.js +5 -59
  90. package/dist/esm/queuer/createQueuer.js.map +1 -1
  91. package/dist/esm/rate-limiter/createRateLimitedSignal.d.ts +6 -2
  92. package/dist/esm/rate-limiter/createRateLimitedSignal.js +7 -3
  93. package/dist/esm/rate-limiter/createRateLimitedSignal.js.map +1 -1
  94. package/dist/esm/rate-limiter/createRateLimitedValue.d.ts +2 -2
  95. package/dist/esm/rate-limiter/createRateLimitedValue.js +2 -2
  96. package/dist/esm/rate-limiter/createRateLimitedValue.js.map +1 -1
  97. package/dist/esm/rate-limiter/createRateLimiter.d.ts +9 -7
  98. package/dist/esm/rate-limiter/createRateLimiter.js +5 -43
  99. package/dist/esm/rate-limiter/createRateLimiter.js.map +1 -1
  100. package/dist/esm/throttler/createThrottledSignal.d.ts +6 -2
  101. package/dist/esm/throttler/createThrottledSignal.js +2 -2
  102. package/dist/esm/throttler/createThrottledSignal.js.map +1 -1
  103. package/dist/esm/throttler/createThrottledValue.d.ts +2 -2
  104. package/dist/esm/throttler/createThrottledValue.js +3 -2
  105. package/dist/esm/throttler/createThrottledValue.js.map +1 -1
  106. package/dist/esm/throttler/createThrottler.d.ts +9 -10
  107. package/dist/esm/throttler/createThrottler.js +8 -35
  108. package/dist/esm/throttler/createThrottler.js.map +1 -1
  109. package/package.json +14 -3
  110. package/src/async-batcher/createAsyncBatcher.ts +98 -0
  111. package/src/async-batcher/index.ts +3 -0
  112. package/src/async-debouncer/createAsyncDebouncer.ts +31 -56
  113. package/src/async-queuer/createAsyncQueuer.ts +18 -141
  114. package/src/async-rate-limiter/createAsyncRateLimiter.ts +20 -75
  115. package/src/async-throttler/createAsyncThrottler.ts +25 -81
  116. package/src/batcher/createBatcher.ts +17 -94
  117. package/src/debouncer/createDebouncedSignal.ts +15 -4
  118. package/src/debouncer/createDebouncedValue.ts +11 -3
  119. package/src/debouncer/createDebouncer.ts +28 -38
  120. package/src/index.ts +3 -0
  121. package/src/queuer/createQueuer.ts +15 -115
  122. package/src/rate-limiter/createRateLimitedSignal.ts +17 -5
  123. package/src/rate-limiter/createRateLimitedValue.ts +8 -4
  124. package/src/rate-limiter/createRateLimiter.ts +25 -62
  125. package/src/throttler/createThrottledSignal.ts +15 -4
  126. package/src/throttler/createThrottledValue.ts +11 -3
  127. package/src/throttler/createThrottler.ts +28 -56
  128. package/dist/cjs/compare/index.cjs +0 -10
  129. package/dist/cjs/compare/index.d.cts +0 -1
  130. package/dist/esm/compare/index.d.ts +0 -1
  131. package/dist/esm/compare/index.js +0 -2
  132. package/src/compare/index.ts +0 -1
@@ -1,57 +1,16 @@
1
1
  import { Queuer } from '@tanstack/pacer/queuer'
2
- import { createSignal } from 'solid-js'
3
- import { bindInstanceMethods } from '@tanstack/pacer/utils'
2
+ import { useStore } from '@tanstack/solid-store'
4
3
  import type { Accessor } from 'solid-js'
5
- import type { QueuerOptions } from '@tanstack/pacer/queuer'
4
+ import type { QueuerOptions, QueuerState } from '@tanstack/pacer/queuer'
6
5
 
7
- export interface SolidQueuer<TValue>
8
- extends Omit<
9
- Queuer<TValue>,
10
- | 'getExecutionCount'
11
- | 'getIsEmpty'
12
- | 'getIsFull'
13
- | 'getIsIdle'
14
- | 'getIsRunning'
15
- | 'getSize'
16
- | 'peekAllItems'
17
- | 'peekNextItem'
18
- > {
6
+ export interface SolidQueuer<TValue, TSelected = QueuerState<TValue>>
7
+ extends Omit<Queuer<TValue>, 'store'> {
19
8
  /**
20
- * Signal version of `peekAllItems`
9
+ * Reactive state that will be updated when the queuer state changes
10
+ *
11
+ * Use this instead of `queuer.store.state`
21
12
  */
22
- allItems: Accessor<Array<TValue>>
23
- /**
24
- * Signal version of `getExecutionCount`
25
- */
26
- executionCount: Accessor<number>
27
- /**
28
- * Signal version of `getIsEmpty`
29
- */
30
- isEmpty: Accessor<boolean>
31
- /**
32
- * Signal version of `getIsFull`
33
- */
34
- isFull: Accessor<boolean>
35
- /**
36
- * Signal version of `getIsIdle`
37
- */
38
- isIdle: Accessor<boolean>
39
- /**
40
- * Signal version of `getIsRunning`
41
- */
42
- isRunning: Accessor<boolean>
43
- /**
44
- * Signal version of `peekNextItem`
45
- */
46
- nextItem: Accessor<TValue | undefined>
47
- /**
48
- * Signal version of `getRejectionCount`
49
- */
50
- rejectionCount: Accessor<number>
51
- /**
52
- * Signal version of `getSize`
53
- */
54
- size: Accessor<number>
13
+ readonly state: Accessor<Readonly<TSelected>>
55
14
  }
56
15
 
57
16
  /**
@@ -105,76 +64,17 @@ export interface SolidQueuer<TValue>
105
64
  * console.log('Next item:', queue.nextItem());
106
65
  * ```
107
66
  */
108
- export function createQueuer<TValue>(
67
+ export function createQueuer<TValue, TSelected = QueuerState<TValue>>(
109
68
  fn: (item: TValue) => void,
110
69
  initialOptions: QueuerOptions<TValue> = {},
111
- ): SolidQueuer<TValue> {
112
- const queuer = bindInstanceMethods(new Queuer<TValue>(fn, initialOptions))
113
-
114
- const [allItems, setAllItems] = createSignal<Array<TValue>>(
115
- queuer.peekAllItems(),
116
- )
117
- const [executionCount, setExecutionCount] = createSignal(
118
- queuer.getExecutionCount(),
119
- )
120
- const [rejectionCount, setRejectionCount] = createSignal(
121
- queuer.getRejectionCount(),
122
- )
123
- const [isEmpty, setIsEmpty] = createSignal(queuer.getIsEmpty())
124
- const [isFull, setIsFull] = createSignal(queuer.getIsFull())
125
- const [isIdle, setIsIdle] = createSignal(queuer.getIsIdle())
126
- const [isRunning, setIsRunning] = createSignal(queuer.getIsRunning())
127
- const [nextItem, setNextItem] = createSignal<TValue | undefined>(
128
- queuer.peekNextItem(),
129
- )
130
- const [size, setSize] = createSignal(queuer.getSize())
131
-
132
- function setOptions(newOptions: Partial<QueuerOptions<TValue>>) {
133
- queuer.setOptions({
134
- ...newOptions,
135
- onItemsChange: (queuer) => {
136
- setAllItems(queuer.peekAllItems())
137
- setExecutionCount(queuer.getExecutionCount())
138
- setIsEmpty(queuer.getIsEmpty())
139
- setIsFull(queuer.getIsFull())
140
- setIsIdle(queuer.getIsIdle())
141
- setNextItem(() => queuer.peekNextItem())
142
- setSize(queuer.getSize())
143
-
144
- const onItemsChange =
145
- newOptions.onItemsChange ?? initialOptions.onItemsChange
146
- onItemsChange?.(queuer)
147
- },
148
- onIsRunningChange: (queuer) => {
149
- setIsRunning(queuer.getIsRunning())
150
- setIsIdle(queuer.getIsIdle())
151
-
152
- const onIsRunningChange =
153
- newOptions.onIsRunningChange ?? initialOptions.onIsRunningChange
154
- onIsRunningChange?.(queuer)
155
- },
156
- onReject: (item, queuer) => {
157
- setRejectionCount(queuer.getRejectionCount())
158
-
159
- const onReject = newOptions.onReject ?? initialOptions.onReject
160
- onReject?.(item, queuer)
161
- },
162
- })
163
- }
70
+ selector?: (state: QueuerState<TValue>) => TSelected,
71
+ ): SolidQueuer<TValue, TSelected> {
72
+ const queuer = new Queuer(fn, initialOptions)
164
73
 
165
- setOptions(initialOptions)
74
+ const state = useStore(queuer.store, selector)
166
75
 
167
76
  return {
168
77
  ...queuer,
169
- allItems,
170
- executionCount,
171
- isEmpty,
172
- isFull,
173
- isIdle,
174
- isRunning,
175
- nextItem,
176
- rejectionCount,
177
- size,
178
- setOptions,
179
- } as SolidQueuer<TValue>
78
+ state,
79
+ } as unknown as SolidQueuer<TValue, TSelected> // omit `store` in favor of `state`
180
80
  }
@@ -2,7 +2,10 @@ import { createSignal } from 'solid-js'
2
2
  import { createRateLimiter } from './createRateLimiter'
3
3
  import type { SolidRateLimiter } from './createRateLimiter'
4
4
  import type { Accessor, Setter } from 'solid-js'
5
- import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
5
+ import type {
6
+ RateLimiterOptions,
7
+ RateLimiterState,
8
+ } from '@tanstack/pacer/rate-limiter'
6
9
 
7
10
  /**
8
11
  * A Solid hook that creates a rate-limited state value that enforces a hard limit on state updates within a time window.
@@ -62,17 +65,26 @@ import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
62
65
  * };
63
66
  * ```
64
67
  */
65
- export function createRateLimitedSignal<TValue>(
68
+ export function createRateLimitedSignal<TValue, TSelected = RateLimiterState>(
66
69
  value: TValue,
67
70
  initialOptions: RateLimiterOptions<Setter<TValue>>,
68
- ): [Accessor<TValue>, Setter<TValue>, SolidRateLimiter<Setter<TValue>>] {
71
+ selector?: (state: RateLimiterState) => TSelected,
72
+ ): [
73
+ Accessor<TValue>,
74
+ Setter<TValue>,
75
+ SolidRateLimiter<Setter<TValue>, TSelected>,
76
+ ] {
69
77
  const [rateLimitedValue, setRateLimitedValue] = createSignal<TValue>(value)
70
78
 
71
- const rateLimiter = createRateLimiter(setRateLimitedValue, initialOptions)
79
+ const rateLimiter = createRateLimiter(
80
+ setRateLimitedValue,
81
+ initialOptions,
82
+ selector,
83
+ )
72
84
 
73
85
  return [
74
86
  rateLimitedValue,
75
- rateLimiter.maybeExecute.bind(rateLimiter) as Setter<TValue>,
87
+ rateLimiter.maybeExecute as Setter<TValue>,
76
88
  rateLimiter,
77
89
  ]
78
90
  }
@@ -2,7 +2,10 @@ import { createEffect } from 'solid-js'
2
2
  import { createRateLimitedSignal } from './createRateLimitedSignal'
3
3
  import type { SolidRateLimiter } from './createRateLimiter'
4
4
  import type { Accessor, Setter } from 'solid-js'
5
- import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
5
+ import type {
6
+ RateLimiterOptions,
7
+ RateLimiterState,
8
+ } from '@tanstack/pacer/rate-limiter'
6
9
 
7
10
  /**
8
11
  * A high-level Solid hook that creates a rate-limited version of a value that updates at most a certain number of times within a time window.
@@ -47,12 +50,13 @@ import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
47
50
  * rateLimiter.reset(); // Reset the rate limit window
48
51
  * ```
49
52
  */
50
- export function createRateLimitedValue<TValue>(
53
+ export function createRateLimitedValue<TValue, TSelected = RateLimiterState>(
51
54
  value: Accessor<TValue>,
52
55
  initialOptions: RateLimiterOptions<Setter<TValue>>,
53
- ): [Accessor<TValue>, SolidRateLimiter<Setter<TValue>>] {
56
+ selector?: (state: RateLimiterState) => TSelected,
57
+ ): [Accessor<TValue>, SolidRateLimiter<Setter<TValue>, TSelected>] {
54
58
  const [rateLimitedValue, setRateLimitedValue, rateLimiter] =
55
- createRateLimitedSignal(value(), initialOptions)
59
+ createRateLimitedSignal(value(), initialOptions, selector)
56
60
 
57
61
  createEffect(() => {
58
62
  setRateLimitedValue(value() as any)
@@ -1,22 +1,22 @@
1
1
  import { RateLimiter } from '@tanstack/pacer/rate-limiter'
2
- import { createSignal } from 'solid-js'
3
- import { bindInstanceMethods } from '@tanstack/pacer/utils'
2
+ import { useStore } from '@tanstack/solid-store'
4
3
  import type { Accessor } from 'solid-js'
5
4
  import type { AnyFunction } from '@tanstack/pacer/types'
6
- import type { RateLimiterOptions } from '@tanstack/pacer/rate-limiter'
5
+ import type {
6
+ RateLimiterOptions,
7
+ RateLimiterState,
8
+ } from '@tanstack/pacer/rate-limiter'
7
9
 
8
- export interface SolidRateLimiter<TFn extends AnyFunction>
9
- extends Omit<
10
- RateLimiter<TFn>,
11
- | 'getExecutionCount'
12
- | 'getMsUntilNextWindow'
13
- | 'getRejectionCount'
14
- | 'getRemainingInWindow'
15
- > {
16
- executionCount: Accessor<number>
17
- msUntilNextWindow: Accessor<number>
18
- rejectionCount: Accessor<number>
19
- remainingInWindow: Accessor<number>
10
+ export interface SolidRateLimiter<
11
+ TFn extends AnyFunction,
12
+ TSelected = RateLimiterState,
13
+ > extends Omit<RateLimiter<TFn>, 'store'> {
14
+ /**
15
+ * Reactive state that will be updated when the rate limiter state changes
16
+ *
17
+ * Use this instead of `rateLimiter.store.state`
18
+ */
19
+ readonly state: Accessor<Readonly<TSelected>>
20
20
  }
21
21
 
22
22
  /**
@@ -59,57 +59,20 @@ export interface SolidRateLimiter<TFn extends AnyFunction>
59
59
  * console.log('Next window in:', rateLimiter.msUntilNextWindow());
60
60
  * ```
61
61
  */
62
- export function createRateLimiter<TFn extends AnyFunction>(
62
+ export function createRateLimiter<
63
+ TFn extends AnyFunction,
64
+ TSelected = RateLimiterState,
65
+ >(
63
66
  fn: TFn,
64
67
  initialOptions: RateLimiterOptions<TFn>,
65
- ): SolidRateLimiter<TFn> {
66
- const rateLimiter = bindInstanceMethods(
67
- new RateLimiter<TFn>(fn, initialOptions),
68
- )
68
+ selector?: (state: RateLimiterState) => TSelected,
69
+ ): SolidRateLimiter<TFn, TSelected> {
70
+ const rateLimiter = new RateLimiter<TFn>(fn, initialOptions)
69
71
 
70
- const [executionCount, setExecutionCount] = createSignal(
71
- rateLimiter.getExecutionCount(),
72
- )
73
- const [rejectionCount, setRejectionCount] = createSignal(
74
- rateLimiter.getRejectionCount(),
75
- )
76
- const [remainingInWindow, setRemainingInWindow] = createSignal(
77
- rateLimiter.getRemainingInWindow(),
78
- )
79
- const [msUntilNextWindow, setMsUntilNextWindow] = createSignal(
80
- rateLimiter.getMsUntilNextWindow(),
81
- )
82
-
83
- function setOptions(newOptions: Partial<RateLimiterOptions<TFn>>) {
84
- rateLimiter.setOptions({
85
- ...newOptions,
86
- onExecute: (rateLimiter) => {
87
- setExecutionCount(rateLimiter.getExecutionCount())
88
- setRemainingInWindow(rateLimiter.getRemainingInWindow())
89
- setMsUntilNextWindow(rateLimiter.getMsUntilNextWindow())
90
-
91
- const onExecute = newOptions.onExecute ?? initialOptions.onExecute
92
- onExecute?.(rateLimiter)
93
- },
94
- onReject: (rateLimiter) => {
95
- setRejectionCount(rateLimiter.getRejectionCount())
96
- setRemainingInWindow(rateLimiter.getRemainingInWindow())
97
- setMsUntilNextWindow(rateLimiter.getMsUntilNextWindow())
98
-
99
- const onReject = newOptions.onReject ?? initialOptions.onReject
100
- onReject?.(rateLimiter)
101
- },
102
- })
103
- }
104
-
105
- setOptions(initialOptions)
72
+ const state = useStore(rateLimiter.store, selector)
106
73
 
107
74
  return {
108
75
  ...rateLimiter,
109
- executionCount,
110
- rejectionCount,
111
- remainingInWindow,
112
- msUntilNextWindow,
113
- setOptions,
114
- } as SolidRateLimiter<TFn>
76
+ state,
77
+ } as unknown as SolidRateLimiter<TFn, TSelected> // omit `store` in favor of `state`
115
78
  }
@@ -2,7 +2,10 @@ import { createSignal } from 'solid-js'
2
2
  import { createThrottler } from './createThrottler'
3
3
  import type { SolidThrottler } from './createThrottler'
4
4
  import type { Accessor, Setter } from 'solid-js'
5
- import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
5
+ import type {
6
+ ThrottlerOptions,
7
+ ThrottlerState,
8
+ } from '@tanstack/pacer/throttler'
6
9
 
7
10
  /**
8
11
  * A Solid hook that creates a throttled state value that updates at most once within a specified time window.
@@ -38,11 +41,19 @@ import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
38
41
  * console.log('Next execution:', throttler.nextExecutionTime());
39
42
  * ```
40
43
  */
41
- export function createThrottledSignal<TValue>(
44
+ export function createThrottledSignal<
45
+ TValue,
46
+ TSelected = ThrottlerState<Setter<TValue>>,
47
+ >(
42
48
  value: TValue,
43
49
  initialOptions: ThrottlerOptions<Setter<TValue>>,
44
- ): [Accessor<TValue>, Setter<TValue>, SolidThrottler<Setter<TValue>>] {
50
+ selector?: (state: ThrottlerState<Setter<TValue>>) => TSelected,
51
+ ): [
52
+ Accessor<TValue>,
53
+ Setter<TValue>,
54
+ SolidThrottler<Setter<TValue>, TSelected>,
55
+ ] {
45
56
  const [throttledValue, setThrottledValue] = createSignal<TValue>(value)
46
- const throttler = createThrottler(setThrottledValue, initialOptions)
57
+ const throttler = createThrottler(setThrottledValue, initialOptions, selector)
47
58
  return [throttledValue, throttler.maybeExecute as Setter<TValue>, throttler]
48
59
  }
@@ -2,7 +2,10 @@ import { createEffect } from 'solid-js'
2
2
  import { createThrottledSignal } from './createThrottledSignal'
3
3
  import type { SolidThrottler } from './createThrottler'
4
4
  import type { Accessor, Setter } from 'solid-js'
5
- import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
5
+ import type {
6
+ ThrottlerOptions,
7
+ ThrottlerState,
8
+ } from '@tanstack/pacer/throttler'
6
9
 
7
10
  /**
8
11
  * A high-level Solid hook that creates a throttled version of a value that updates at most once within a specified time window.
@@ -32,13 +35,18 @@ import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
32
35
  * throttler.cancel(); // Cancel any pending updates
33
36
  * ```
34
37
  */
35
- export function createThrottledValue<TValue>(
38
+ export function createThrottledValue<
39
+ TValue,
40
+ TSelected = ThrottlerState<Setter<TValue>>,
41
+ >(
36
42
  value: Accessor<TValue>,
37
43
  initialOptions: ThrottlerOptions<Setter<TValue>>,
38
- ): [Accessor<TValue>, SolidThrottler<Setter<TValue>>] {
44
+ selector?: (state: ThrottlerState<Setter<TValue>>) => TSelected,
45
+ ): [Accessor<TValue>, SolidThrottler<Setter<TValue>, TSelected>] {
39
46
  const [throttledValue, setThrottledValue, throttler] = createThrottledSignal(
40
47
  value(),
41
48
  initialOptions,
49
+ selector,
42
50
  )
43
51
 
44
52
  createEffect(() => {
@@ -1,25 +1,23 @@
1
1
  import { Throttler } from '@tanstack/pacer/throttler'
2
- import { createEffect, createSignal, onCleanup } from 'solid-js'
3
- import { bindInstanceMethods } from '@tanstack/pacer/utils'
2
+ import { createEffect, onCleanup } from 'solid-js'
3
+ import { useStore } from '@tanstack/solid-store'
4
4
  import type { Accessor } from 'solid-js'
5
5
  import type { AnyFunction } from '@tanstack/pacer/types'
6
- import type { ThrottlerOptions } from '@tanstack/pacer/throttler'
6
+ import type {
7
+ ThrottlerOptions,
8
+ ThrottlerState,
9
+ } from '@tanstack/pacer/throttler'
7
10
 
8
- /**
9
- * An extension of the Throttler class that adds Solid signals to access the internal state of the throttler
10
- */
11
- export interface SolidThrottler<TFn extends AnyFunction>
12
- extends Omit<
13
- Throttler<TFn>,
14
- | 'getExecutionCount'
15
- | 'getIsPending'
16
- | 'getLastExecutionTime'
17
- | 'getNextExecutionTime'
18
- > {
19
- executionCount: Accessor<number>
20
- isPending: Accessor<boolean>
21
- lastExecutionTime: Accessor<number>
22
- nextExecutionTime: Accessor<number>
11
+ export interface SolidThrottler<
12
+ TFn extends AnyFunction,
13
+ TSelected = ThrottlerState<TFn>,
14
+ > extends Omit<Throttler<TFn>, 'store'> {
15
+ /**
16
+ * Reactive state that will be updated when the throttler state changes
17
+ *
18
+ * Use this instead of `throttler.store.state`
19
+ */
20
+ readonly state: Accessor<Readonly<TSelected>>
23
21
  }
24
22
 
25
23
  /**
@@ -56,52 +54,26 @@ export interface SolidThrottler<TFn extends AnyFunction>
56
54
  * console.log(throttler.nextExecutionTime()); // timestamp of next allowed execution
57
55
  * ```
58
56
  */
59
- export function createThrottler<TFn extends AnyFunction>(
57
+ export function createThrottler<
58
+ TFn extends AnyFunction,
59
+ TSelected = ThrottlerState<TFn>,
60
+ >(
60
61
  fn: TFn,
61
62
  initialOptions: ThrottlerOptions<TFn>,
62
- ): SolidThrottler<TFn> {
63
- const throttler = bindInstanceMethods(new Throttler<TFn>(fn, initialOptions))
64
-
65
- const [executionCount, setExecutionCount] = createSignal(
66
- throttler.getExecutionCount(),
67
- )
68
- const [isPending, setIsPending] = createSignal(throttler.getIsPending())
69
- const [lastExecutionTime, setLastExecutionTime] = createSignal(
70
- throttler.getLastExecutionTime(),
71
- )
72
- const [nextExecutionTime, setNextExecutionTime] = createSignal(
73
- throttler.getNextExecutionTime(),
74
- )
75
-
76
- function setOptions(newOptions: Partial<ThrottlerOptions<TFn>>) {
77
- throttler.setOptions({
78
- ...newOptions,
79
- onExecute: (throttler) => {
80
- setExecutionCount(throttler.getExecutionCount())
81
- setIsPending(throttler.getIsPending())
82
- setLastExecutionTime(throttler.getLastExecutionTime())
83
- setNextExecutionTime(throttler.getNextExecutionTime())
84
-
85
- const onExecute = newOptions.onExecute ?? initialOptions.onExecute
86
- onExecute?.(throttler)
87
- },
88
- })
89
- }
63
+ selector?: (state: ThrottlerState<TFn>) => TSelected,
64
+ ): SolidThrottler<TFn, TSelected> {
65
+ const asyncThrottler = new Throttler<TFn>(fn, initialOptions)
90
66
 
91
- setOptions(initialOptions)
67
+ const state = useStore(asyncThrottler.store, selector)
92
68
 
93
69
  createEffect(() => {
94
70
  onCleanup(() => {
95
- throttler.cancel()
71
+ asyncThrottler.cancel()
96
72
  })
97
73
  })
98
74
 
99
75
  return {
100
- ...throttler,
101
- executionCount,
102
- isPending,
103
- lastExecutionTime,
104
- nextExecutionTime,
105
- setOptions,
106
- } as SolidThrottler<TFn>
76
+ ...asyncThrottler,
77
+ state,
78
+ } as SolidThrottler<TFn, TSelected> // omit `store` in favor of `state`
107
79
  }
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const compare = require("@tanstack/pacer/compare");
4
- Object.keys(compare).forEach((k) => {
5
- if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
6
- enumerable: true,
7
- get: () => compare[k]
8
- });
9
- });
10
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- export * from '@tanstack/pacer/compare';
@@ -1 +0,0 @@
1
- export * from '@tanstack/pacer/compare';
@@ -1,2 +0,0 @@
1
- export * from "@tanstack/pacer/compare";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- export * from '@tanstack/pacer/compare'