@363045841yyt/klinechart-core 0.7.3 → 0.7.5
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 +201 -201
- package/README.zh-CN.md +201 -201
- package/dist/controllers/index.d.ts +1 -0
- package/dist/controllers/index.d.ts.map +1 -1
- package/dist/controllers/index.js +1 -0
- package/dist/controllers/index.js.map +1 -1
- package/dist/engine/chart.d.ts +11 -19
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +92 -109
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.d.ts +1 -0
- package/dist/engine/renderers/Indicator/indicatorData.d.ts.map +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.js +1 -1
- package/dist/engine/renderers/Indicator/indicatorData.js.map +1 -1
- package/dist/engine/renderers/webgl/candleSurface.js +47 -47
- package/dist/engine/subPaneManager.d.ts +4 -0
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +13 -0
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -2
- package/dist/version.js.map +1 -1
- package/package.json +129 -122
- package/src/__tests__/signal.test.ts +124 -124
- package/src/config/chartSettings.ts +66 -66
- package/src/controllers/__tests__/drawing.test.ts +214 -214
- package/src/controllers/__tests__/indicatorSelector.test.ts +481 -481
- package/src/controllers/__tests__/toolbar.test.ts +225 -225
- package/src/controllers/createChartController.ts +665 -665
- package/src/controllers/createDrawingController.ts +96 -96
- package/src/controllers/createIndicatorSelectorController.ts +307 -307
- package/src/controllers/createToolbarController.ts +146 -146
- package/src/controllers/index.ts +20 -19
- package/src/controllers/types.ts +284 -284
- package/src/engine/__tests__/chart.dpr.test.ts +401 -401
- package/src/engine/__tests__/paneRenderer.resize.test.ts +92 -92
- package/src/engine/chart-store.ts +121 -121
- package/src/engine/chart.d.ts +617 -617
- package/src/engine/chart.ts +2803 -2815
- package/src/engine/controller/__tests__/interaction.dpr.test.ts +259 -259
- package/src/engine/controller/interaction.ts +722 -722
- package/src/engine/controller/markerInteraction.ts +130 -130
- package/src/engine/controller/pinchTracker.ts +82 -82
- package/src/engine/controller/tooltipPosition.ts +48 -48
- package/src/engine/draw/__tests__/pixelAlign.spec.ts +176 -176
- package/src/engine/draw/pixelAlign.ts +259 -259
- package/src/engine/drawing/index.ts +655 -655
- package/src/engine/drawing/interaction.ts +842 -842
- package/src/engine/drawing/plugin.ts +343 -343
- package/src/engine/indicators/__tests__/__fixtures__/golden/atr.json +38 -38
- package/src/engine/indicators/__tests__/__fixtures__/golden/dema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/hma.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/index.ts +55 -55
- package/src/engine/indicators/__tests__/__fixtures__/golden/kama.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/tema.json +14 -14
- package/src/engine/indicators/__tests__/__fixtures__/golden/wma.json +40 -40
- package/src/engine/indicators/__tests__/__fixtures__/synthetic.ts +65 -65
- package/src/engine/indicators/__tests__/_propertyAssertions.ts +76 -76
- package/src/engine/indicators/__tests__/atr.test.ts +153 -153
- package/src/engine/indicators/__tests__/calculators.test.ts +614 -614
- package/src/engine/indicators/__tests__/cmf-mfi.test.ts +100 -100
- package/src/engine/indicators/__tests__/dema.test.ts +73 -73
- package/src/engine/indicators/__tests__/donchian.test.ts +70 -70
- package/src/engine/indicators/__tests__/hma.test.ts +73 -73
- package/src/engine/indicators/__tests__/ichimoku.test.ts +105 -105
- package/src/engine/indicators/__tests__/kama.test.ts +80 -80
- package/src/engine/indicators/__tests__/keltner.test.ts +65 -65
- package/src/engine/indicators/__tests__/pivot-fib.test.ts +110 -110
- package/src/engine/indicators/__tests__/roc.test.ts +68 -68
- package/src/engine/indicators/__tests__/sar.test.ts +86 -86
- package/src/engine/indicators/__tests__/scheduler.test.ts +831 -831
- package/src/engine/indicators/__tests__/soa.test.ts +533 -533
- package/src/engine/indicators/__tests__/structure.test.ts +110 -110
- package/src/engine/indicators/__tests__/supertrend.test.ts +65 -65
- package/src/engine/indicators/__tests__/tema.test.ts +68 -68
- package/src/engine/indicators/__tests__/trix.test.ts +70 -70
- package/src/engine/indicators/__tests__/volatility.test.ts +117 -117
- package/src/engine/indicators/__tests__/volume.test.ts +115 -115
- package/src/engine/indicators/__tests__/volumeProfile.test.ts +74 -74
- package/src/engine/indicators/__tests__/vwap.test.ts +69 -69
- package/src/engine/indicators/__tests__/wma.test.ts +112 -112
- package/src/engine/indicators/__tests__/zones.test.ts +95 -95
- package/src/engine/indicators/atrState.ts +27 -27
- package/src/engine/indicators/bollState.ts +51 -51
- package/src/engine/indicators/calculators.ts +2593 -2593
- package/src/engine/indicators/cciState.ts +25 -25
- package/src/engine/indicators/chaikinVolState.ts +32 -32
- package/src/engine/indicators/cmfState.ts +27 -27
- package/src/engine/indicators/demaState.ts +27 -27
- package/src/engine/indicators/donchianState.ts +43 -43
- package/src/engine/indicators/eneState.ts +43 -43
- package/src/engine/indicators/expmaState.ts +43 -43
- package/src/engine/indicators/fastkState.ts +25 -25
- package/src/engine/indicators/fibState.ts +41 -41
- package/src/engine/indicators/hmaState.ts +27 -27
- package/src/engine/indicators/hvState.ts +28 -28
- package/src/engine/indicators/ichimokuState.ts +70 -70
- package/src/engine/indicators/indicator.worker.ts +169 -169
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +62 -62
- package/src/engine/indicators/indicatorMetadata.ts +110 -110
- package/src/engine/indicators/indicatorRegistry.ts +106 -106
- package/src/engine/indicators/indicatorRuntime.ts +1548 -1548
- package/src/engine/indicators/kamaState.ts +34 -34
- package/src/engine/indicators/keltnerState.ts +49 -49
- package/src/engine/indicators/kstState.ts +42 -42
- package/src/engine/indicators/maState.ts +36 -36
- package/src/engine/indicators/macdState.ts +76 -76
- package/src/engine/indicators/mfiState.ts +27 -27
- package/src/engine/indicators/momState.ts +25 -25
- package/src/engine/indicators/obvState.ts +25 -25
- package/src/engine/indicators/parkinsonState.ts +28 -28
- package/src/engine/indicators/pivotState.ts +51 -51
- package/src/engine/indicators/pvtState.ts +25 -25
- package/src/engine/indicators/rocState.ts +27 -27
- package/src/engine/indicators/rsiState.ts +65 -65
- package/src/engine/indicators/sarState.ts +41 -41
- package/src/engine/indicators/scheduler.ts +1205 -1205
- package/src/engine/indicators/soa.ts +352 -352
- package/src/engine/indicators/stateComposer.ts +1262 -1262
- package/src/engine/indicators/stochState.ts +26 -26
- package/src/engine/indicators/structureState.ts +69 -69
- package/src/engine/indicators/supertrendState.ts +37 -37
- package/src/engine/indicators/temaState.ts +27 -27
- package/src/engine/indicators/trixState.ts +35 -35
- package/src/engine/indicators/vmaState.ts +27 -27
- package/src/engine/indicators/volumeProfileState.ts +63 -63
- package/src/engine/indicators/vwapState.ts +29 -29
- package/src/engine/indicators/wmaState.ts +27 -27
- package/src/engine/indicators/wmsrState.ts +25 -25
- package/src/engine/indicators/workerProtocol.ts +613 -613
- package/src/engine/indicators/zonesState.ts +47 -47
- package/src/engine/layout/pane.ts +161 -161
- package/src/engine/marker/registry.ts +265 -265
- package/src/engine/paneRenderer.ts +169 -169
- package/src/engine/renderers/Indicator/atr.ts +237 -237
- package/src/engine/renderers/Indicator/boll.ts +317 -317
- package/src/engine/renderers/Indicator/cci.ts +275 -275
- package/src/engine/renderers/Indicator/chaikinVol.ts +138 -138
- package/src/engine/renderers/Indicator/cmf.ts +137 -137
- package/src/engine/renderers/Indicator/dema.ts +136 -136
- package/src/engine/renderers/Indicator/donchian.ts +137 -137
- package/src/engine/renderers/Indicator/ene.ts +271 -271
- package/src/engine/renderers/Indicator/expma.ts +197 -197
- package/src/engine/renderers/Indicator/fastk.ts +316 -316
- package/src/engine/renderers/Indicator/fib.ts +141 -141
- package/src/engine/renderers/Indicator/hma.ts +136 -136
- package/src/engine/renderers/Indicator/hv.ts +124 -124
- package/src/engine/renderers/Indicator/ichimoku.ts +181 -181
- package/src/engine/renderers/Indicator/index.ts +241 -241
- package/src/engine/renderers/Indicator/indicatorData.ts +650 -650
- package/src/engine/renderers/Indicator/kama.ts +136 -136
- package/src/engine/renderers/Indicator/keltner.ts +137 -137
- package/src/engine/renderers/Indicator/kst.ts +302 -302
- package/src/engine/renderers/Indicator/ma.ts +200 -200
- package/src/engine/renderers/Indicator/macd.ts +477 -477
- package/src/engine/renderers/Indicator/macdLegend.ts +141 -141
- package/src/engine/renderers/Indicator/mainIndicatorLegend.ts +272 -272
- package/src/engine/renderers/Indicator/mfi.ts +142 -142
- package/src/engine/renderers/Indicator/mom.ts +311 -311
- package/src/engine/renderers/Indicator/obv.ts +123 -123
- package/src/engine/renderers/Indicator/parkinson.ts +124 -124
- package/src/engine/renderers/Indicator/pivot.ts +131 -131
- package/src/engine/renderers/Indicator/pvt.ts +123 -123
- package/src/engine/renderers/Indicator/roc.ts +143 -143
- package/src/engine/renderers/Indicator/rsi.ts +390 -390
- package/src/engine/renderers/Indicator/sar.ts +113 -113
- package/src/engine/renderers/Indicator/scale/atr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/cci_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/fastk_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/indicator_scale.ts +204 -204
- package/src/engine/renderers/Indicator/scale/kst_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/macd_scale.ts +22 -22
- package/src/engine/renderers/Indicator/scale/mom_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/rsi_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/stoch_scale.ts +19 -19
- package/src/engine/renderers/Indicator/scale/volume_scale.ts +26 -26
- package/src/engine/renderers/Indicator/scale/wmsr_scale.ts +19 -19
- package/src/engine/renderers/Indicator/stoch.ts +359 -359
- package/src/engine/renderers/Indicator/structure.ts +126 -126
- package/src/engine/renderers/Indicator/subPaneConfig.ts +265 -265
- package/src/engine/renderers/Indicator/supertrend.ts +115 -115
- package/src/engine/renderers/Indicator/tema.ts +136 -136
- package/src/engine/renderers/Indicator/trix.ts +158 -158
- package/src/engine/renderers/Indicator/vma.ts +124 -124
- package/src/engine/renderers/Indicator/volumeProfile.ts +125 -125
- package/src/engine/renderers/Indicator/vwap.ts +123 -123
- package/src/engine/renderers/Indicator/wma.ts +136 -136
- package/src/engine/renderers/Indicator/wmsr.ts +328 -328
- package/src/engine/renderers/Indicator/zones.ts +104 -104
- package/src/engine/renderers/__tests__/boll.renderer.test.ts +314 -314
- package/src/engine/renderers/__tests__/ene.renderer.test.ts +305 -305
- package/src/engine/renderers/__tests__/expma.renderer.test.ts +279 -279
- package/src/engine/renderers/__tests__/ma.renderer.test.ts +426 -426
- package/src/engine/renderers/__tests__/mainIndicatorLegend.renderer.test.ts +502 -502
- package/src/engine/renderers/__tests__/yAxis.renderer.test.ts +173 -173
- package/src/engine/renderers/candle.ts +459 -459
- package/src/engine/renderers/crosshair.ts +69 -69
- package/src/engine/renderers/customMarkers.ts +162 -162
- package/src/engine/renderers/extremaMarkers.ts +246 -246
- package/src/engine/renderers/gridLines.ts +90 -90
- package/src/engine/renderers/lastPrice.ts +97 -97
- package/src/engine/renderers/paneTitle.ts +136 -136
- package/src/engine/renderers/subVolume.ts +236 -236
- package/src/engine/renderers/timeAxis.ts +121 -121
- package/src/engine/renderers/webgl/candleSurface.ts +955 -955
- package/src/engine/renderers/webgl/sharedWebGLSurface.ts +146 -146
- package/src/engine/renderers/yAxis.ts +105 -105
- package/src/engine/scale/__tests__/logFormula.spec.ts +148 -148
- package/src/engine/scale/logFormula.ts +130 -130
- package/src/engine/scale/price.ts +39 -39
- package/src/engine/scale/priceScale.ts +264 -264
- package/src/engine/subPaneManager.ts +442 -427
- package/src/engine/theme/colors.ts +642 -642
- package/src/engine/theme/fonts.ts +20 -20
- package/src/engine/utils/klineConfig.ts +49 -49
- package/src/engine/utils/tickCount.ts +11 -11
- package/src/engine/utils/tickPosition.ts +214 -214
- package/src/engine/utils/zoom.ts +83 -83
- package/src/engine/viewport/viewport.ts +67 -67
- package/src/index.ts +3 -3
- package/src/plugin/ConfigManager.ts +93 -93
- package/src/plugin/EventBus.ts +77 -77
- package/src/plugin/HookSystem.ts +106 -106
- package/src/plugin/PluginHost.ts +243 -243
- package/src/plugin/PluginRegistry.ts +92 -92
- package/src/plugin/StateStore.ts +73 -73
- package/src/plugin/index.ts +19 -19
- package/src/plugin/rendererPluginManager.ts +368 -368
- package/src/plugin/stateKeys.ts +8 -8
- package/src/plugin/types.ts +526 -526
- package/src/reactivity/index.ts +2 -2
- package/src/reactivity/signal.ts +119 -119
- package/src/semantic/controller.ts +251 -251
- package/src/semantic/drawShape.ts +260 -260
- package/src/semantic/index.ts +28 -28
- package/src/semantic/schema.json +256 -256
- package/src/semantic/types.ts +251 -251
- package/src/semantic/validator.ts +349 -349
- package/src/types/kLine.ts +13 -13
- package/src/types/price.ts +56 -56
- package/src/types/volumePrice.ts +33 -33
- package/src/utils/dateFormat.ts +208 -208
- package/src/utils/kLineDraw/axis.ts +562 -562
- package/src/utils/priceToY.ts +34 -34
- package/src/utils/volumePrice.ts +202 -202
- package/src/version.ts +1 -1
package/src/reactivity/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createSignal, computed, effect, batch } from './signal'
|
|
2
|
-
export type { Signal, Computed } from './signal'
|
|
1
|
+
export { createSignal, computed, effect, batch } from './signal'
|
|
2
|
+
export type { Signal, Computed } from './signal'
|
package/src/reactivity/signal.ts
CHANGED
|
@@ -1,119 +1,119 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tiny push-based reactivity primitive. Zero dependencies.
|
|
3
|
-
*
|
|
4
|
-
* Design constraints:
|
|
5
|
-
* - Synchronous notify on `set` (no microtask scheduling — adapters batch)
|
|
6
|
-
* - No proxy / no deep tracking — only top-level read/write
|
|
7
|
-
* - Equality short-circuits on `Object.is`
|
|
8
|
-
* - `subscribe` returns an unsubscribe; safe to call from React useSyncExternalStore,
|
|
9
|
-
* Vue effect, Angular toSignal
|
|
10
|
-
* - `effect` re-runs whenever any signal read inside re-emits
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
export type Signal<T> = {
|
|
14
|
-
/** read current value; tracked when called inside `effect` */
|
|
15
|
-
(): T
|
|
16
|
-
/** read without tracking */
|
|
17
|
-
peek: () => T
|
|
18
|
-
/** write new value; notifies subscribers if `Object.is` differs */
|
|
19
|
-
set: (next: T) => void
|
|
20
|
-
/** subscribe; returns unsubscribe */
|
|
21
|
-
subscribe: (listener: () => void) => () => void
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type Computed<T> = {
|
|
25
|
-
(): T
|
|
26
|
-
peek: () => T
|
|
27
|
-
subscribe: (listener: () => void) => () => void
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
type Tracker = {
|
|
31
|
-
deps: Set<Set<() => void>>
|
|
32
|
-
run: () => void
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
let activeTracker: Tracker | null = null
|
|
36
|
-
|
|
37
|
-
export function createSignal<T>(initial: T): Signal<T> {
|
|
38
|
-
let value = initial
|
|
39
|
-
const subscribers = new Set<() => void>()
|
|
40
|
-
|
|
41
|
-
const read = (): T => {
|
|
42
|
-
if (activeTracker !== null) {
|
|
43
|
-
subscribers.add(activeTracker.run)
|
|
44
|
-
activeTracker.deps.add(subscribers)
|
|
45
|
-
}
|
|
46
|
-
return value
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const peek = (): T => value
|
|
50
|
-
|
|
51
|
-
const set = (next: T): void => {
|
|
52
|
-
if (Object.is(value, next)) return
|
|
53
|
-
value = next
|
|
54
|
-
// copy to allow listener self-unsubscribe during notify
|
|
55
|
-
for (const listener of [...subscribers]) listener()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const subscribe = (listener: () => void): (() => void) => {
|
|
59
|
-
subscribers.add(listener)
|
|
60
|
-
return () => {
|
|
61
|
-
subscribers.delete(listener)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return Object.assign(read, { peek, set, subscribe }) as Signal<T>
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function effect(fn: () => void): () => void {
|
|
69
|
-
const tracker: Tracker = {
|
|
70
|
-
deps: new Set(),
|
|
71
|
-
run: () => {
|
|
72
|
-
// tear down previous subscriptions before re-tracking
|
|
73
|
-
for (const dep of tracker.deps) dep.delete(tracker.run)
|
|
74
|
-
tracker.deps.clear()
|
|
75
|
-
const prev = activeTracker
|
|
76
|
-
activeTracker = tracker
|
|
77
|
-
try {
|
|
78
|
-
fn()
|
|
79
|
-
} finally {
|
|
80
|
-
activeTracker = prev
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
}
|
|
84
|
-
tracker.run()
|
|
85
|
-
return () => {
|
|
86
|
-
for (const dep of tracker.deps) dep.delete(tracker.run)
|
|
87
|
-
tracker.deps.clear()
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function computed<T>(fn: () => T): Computed<T> {
|
|
92
|
-
const inner = createSignal<T>(undefined as unknown as T)
|
|
93
|
-
let initialized = false
|
|
94
|
-
effect(() => {
|
|
95
|
-
const next = fn()
|
|
96
|
-
if (!initialized) {
|
|
97
|
-
initialized = true
|
|
98
|
-
// bypass equality check on first run
|
|
99
|
-
;(inner as unknown as { set: (v: T) => void }).set(next)
|
|
100
|
-
return
|
|
101
|
-
}
|
|
102
|
-
inner.set(next)
|
|
103
|
-
})
|
|
104
|
-
const read = (): T => inner()
|
|
105
|
-
return Object.assign(read, { peek: inner.peek, subscribe: inner.subscribe }) as Computed<T>
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Batch multiple signal writes; subscribers fire once per signal after `fn` returns.
|
|
110
|
-
* Useful when controllers mutate several signals in a single transaction.
|
|
111
|
-
*
|
|
112
|
-
* Implementation note: current `set` is synchronous-notify; batch wraps writes
|
|
113
|
-
* by deferring notifications via a microtask queue per signal. For now we keep
|
|
114
|
-
* batch a no-op marker since signal writes are already coalesced via Object.is —
|
|
115
|
-
* adapters can wrap their own batching (React's automatic batching, Vue's nextTick).
|
|
116
|
-
*/
|
|
117
|
-
export function batch<T>(fn: () => T): T {
|
|
118
|
-
return fn()
|
|
119
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Tiny push-based reactivity primitive. Zero dependencies.
|
|
3
|
+
*
|
|
4
|
+
* Design constraints:
|
|
5
|
+
* - Synchronous notify on `set` (no microtask scheduling — adapters batch)
|
|
6
|
+
* - No proxy / no deep tracking — only top-level read/write
|
|
7
|
+
* - Equality short-circuits on `Object.is`
|
|
8
|
+
* - `subscribe` returns an unsubscribe; safe to call from React useSyncExternalStore,
|
|
9
|
+
* Vue effect, Angular toSignal
|
|
10
|
+
* - `effect` re-runs whenever any signal read inside re-emits
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
export type Signal<T> = {
|
|
14
|
+
/** read current value; tracked when called inside `effect` */
|
|
15
|
+
(): T
|
|
16
|
+
/** read without tracking */
|
|
17
|
+
peek: () => T
|
|
18
|
+
/** write new value; notifies subscribers if `Object.is` differs */
|
|
19
|
+
set: (next: T) => void
|
|
20
|
+
/** subscribe; returns unsubscribe */
|
|
21
|
+
subscribe: (listener: () => void) => () => void
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type Computed<T> = {
|
|
25
|
+
(): T
|
|
26
|
+
peek: () => T
|
|
27
|
+
subscribe: (listener: () => void) => () => void
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type Tracker = {
|
|
31
|
+
deps: Set<Set<() => void>>
|
|
32
|
+
run: () => void
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let activeTracker: Tracker | null = null
|
|
36
|
+
|
|
37
|
+
export function createSignal<T>(initial: T): Signal<T> {
|
|
38
|
+
let value = initial
|
|
39
|
+
const subscribers = new Set<() => void>()
|
|
40
|
+
|
|
41
|
+
const read = (): T => {
|
|
42
|
+
if (activeTracker !== null) {
|
|
43
|
+
subscribers.add(activeTracker.run)
|
|
44
|
+
activeTracker.deps.add(subscribers)
|
|
45
|
+
}
|
|
46
|
+
return value
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const peek = (): T => value
|
|
50
|
+
|
|
51
|
+
const set = (next: T): void => {
|
|
52
|
+
if (Object.is(value, next)) return
|
|
53
|
+
value = next
|
|
54
|
+
// copy to allow listener self-unsubscribe during notify
|
|
55
|
+
for (const listener of [...subscribers]) listener()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const subscribe = (listener: () => void): (() => void) => {
|
|
59
|
+
subscribers.add(listener)
|
|
60
|
+
return () => {
|
|
61
|
+
subscribers.delete(listener)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return Object.assign(read, { peek, set, subscribe }) as Signal<T>
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function effect(fn: () => void): () => void {
|
|
69
|
+
const tracker: Tracker = {
|
|
70
|
+
deps: new Set(),
|
|
71
|
+
run: () => {
|
|
72
|
+
// tear down previous subscriptions before re-tracking
|
|
73
|
+
for (const dep of tracker.deps) dep.delete(tracker.run)
|
|
74
|
+
tracker.deps.clear()
|
|
75
|
+
const prev = activeTracker
|
|
76
|
+
activeTracker = tracker
|
|
77
|
+
try {
|
|
78
|
+
fn()
|
|
79
|
+
} finally {
|
|
80
|
+
activeTracker = prev
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
tracker.run()
|
|
85
|
+
return () => {
|
|
86
|
+
for (const dep of tracker.deps) dep.delete(tracker.run)
|
|
87
|
+
tracker.deps.clear()
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function computed<T>(fn: () => T): Computed<T> {
|
|
92
|
+
const inner = createSignal<T>(undefined as unknown as T)
|
|
93
|
+
let initialized = false
|
|
94
|
+
effect(() => {
|
|
95
|
+
const next = fn()
|
|
96
|
+
if (!initialized) {
|
|
97
|
+
initialized = true
|
|
98
|
+
// bypass equality check on first run
|
|
99
|
+
;(inner as unknown as { set: (v: T) => void }).set(next)
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
inner.set(next)
|
|
103
|
+
})
|
|
104
|
+
const read = (): T => inner()
|
|
105
|
+
return Object.assign(read, { peek: inner.peek, subscribe: inner.subscribe }) as Computed<T>
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Batch multiple signal writes; subscribers fire once per signal after `fn` returns.
|
|
110
|
+
* Useful when controllers mutate several signals in a single transaction.
|
|
111
|
+
*
|
|
112
|
+
* Implementation note: current `set` is synchronous-notify; batch wraps writes
|
|
113
|
+
* by deferring notifications via a microtask queue per signal. For now we keep
|
|
114
|
+
* batch a no-op marker since signal writes are already coalesced via Object.is —
|
|
115
|
+
* adapters can wrap their own batching (React's automatic batching, Vue's nextTick).
|
|
116
|
+
*/
|
|
117
|
+
export function batch<T>(fn: () => T): T {
|
|
118
|
+
return fn()
|
|
119
|
+
}
|