cereb 0.2.0 → 0.3.0

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
@@ -23,10 +23,12 @@ import { singlePointer } from "cereb";
23
23
  * - Keeps pointer handling clear and purpose-driven—no need to juggle multiple DOM event shapes.
24
24
  * - Lets you coordinate and control priority across multiple input streams.
25
25
  */
26
- singlePointer(canvas).subscribe((e) => {
27
- switch (e.phase) {
26
+ singlePointer(canvas).subscribe((signal) => {
27
+ const { phase, x, y } = signal.value;
28
+
29
+ switch (phase) {
28
30
  case "move":
29
- point.style.setProperty("transform", `translateX(${e.x}, ${e.y})`);
31
+ point.style.setProperty("transform", `translateX(${x}, ${y})`);
30
32
  break;
31
33
  }
32
34
  });
@@ -63,7 +65,7 @@ const pointSomething$ = pipe(
63
65
  singlePointerEmitter(),
64
66
  );
65
67
 
66
- pointSomething$.subscribe((e) => console.log(e.x, e.y));
68
+ pointSomething$.subscribe((signal) => { /* .. */ });
67
69
  ```
68
70
 
69
71
  ### Blocking Streams
@@ -80,7 +82,26 @@ stream$.block(); // Pause event processing
80
82
  stream$.unblock(); // Resume event processing
81
83
  ```
82
84
 
83
- ## Operators
85
+ ## Cereb Operators
86
+
87
+ | Operator | Description |
88
+ |----------|-------------|
89
+ | `offset` | Add element-relative `offsetX`, `offsetY` to pointer signals |
90
+
91
+ ```typescript
92
+ import { pipe, singlePointer, offset } from "cereb";
93
+
94
+ const stream = pipe(
95
+ singlePointer(element),
96
+ offset({ target: element }) // includes offsetX, offsetY relative to target element
97
+ );
98
+
99
+ stream.subscribe((signal) => {
100
+ const { x, y, offsetX, offsetY } = signal.value;
101
+ });
102
+ ```
103
+
104
+ ## General Operators
84
105
 
85
106
  Core includes common stream operators:
86
107
 
@@ -1,4 +1,4 @@
1
1
  export { setCerebDeviceId } from './meta.js';
2
- export type { Signal } from './signal.js';
2
+ export type { ExtendSignalValue, Signal } from './signal.js';
3
3
  export { createStream, type Observer, type Operator, type Stream, type Unsubscribe, } from './stream.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,EACb,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,WAAW,GACjB,MAAM,aAAa,CAAC"}
@@ -5,5 +5,15 @@ export interface Signal<K extends string = string, V = unknown> {
5
5
  createdAt: number;
6
6
  updatedAt?: number;
7
7
  }
8
+ /**
9
+ * Utility type to extend a Signal's value type with additional properties.
10
+ * Used by operators that add computed properties to signals.
11
+ */
12
+ export type ExtendSignalValue<T extends Signal, Additional> = Signal<T["kind"], T["value"] & Additional>;
13
+ /**
14
+ * Utility type to constrain a Signal to have specific value properties.
15
+ * Used by operators that require certain properties in the input signal.
16
+ */
17
+ export type SignalWith<V> = Signal<string, V>;
8
18
  export declare function createSignal<K extends string = string, V = unknown>(kind: K, value: V): Signal<K, V>;
9
19
  //# sourceMappingURL=signal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/core/signal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO;IAC5D,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,EACjE,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAOd"}
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../src/core/signal.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO;IAC5D,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,UAAU,IAAI,MAAM,CAClE,CAAC,CAAC,MAAM,CAAC,EACT,CAAC,CAAC,OAAO,CAAC,GAAG,UAAU,CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAE9C,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,EACjE,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,GACP,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAOd"}
@@ -1 +1 @@
1
- {"version":3,"file":"emitter-CyT5OiQO.cjs","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/internal/object-pool.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/pool.ts","../src/browser/single-pointer/emitter.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n kind: K;\n value: V;\n deviceId: string;\n createdAt: number;\n updatedAt?: number;\n}\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","export interface ObjectPool<T> {\n acquire(): T;\n release(item: T): void;\n readonly size: number;\n}\n\nexport interface ObjectPoolOptions {\n initialSize?: number;\n maxSize?: number;\n}\n\n/**\n * Generic object pool for reusing objects and reducing GC pressure.\n * Useful for high-frequency scenarios like pointer/touch events.\n */\nexport function createObjectPool<T>(\n create: () => T,\n reset: (item: T) => void,\n options: ObjectPoolOptions = {},\n): ObjectPool<T> {\n const { initialSize = 0, maxSize = 100 } = options;\n const pool: T[] = [];\n\n for (let i = 0; i < initialSize; i++) {\n pool.push(create());\n }\n\n return {\n get size() {\n return pool.length;\n },\n\n acquire(): T {\n if (pool.length > 0) {\n return pool.pop()!;\n }\n return create();\n },\n\n release(item: T): void {\n if (pool.length < maxSize) {\n reset(item);\n pool.push(item);\n }\n },\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n\nexport function resetSinglePointerSignal(p: SinglePointerSignal): void {\n p.value.phase = \"move\";\n p.value.x = 0;\n p.value.y = 0;\n p.value.pageX = 0;\n p.value.pageY = 0;\n p.value.pointerType = \"unknown\";\n p.value.button = \"none\";\n p.value.pressure = 0.5;\n p.updatedAt = performance.now();\n}\n","import { createObjectPool } from \"../../internal/object-pool.js\";\nimport {\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\n\nexport const singlePointerPool = createObjectPool<SinglePointerSignal>(\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n {\n initialSize: 20,\n maxSize: 100,\n },\n);\n\nexport function releaseSinglePointer(signal: SinglePointerSignal): void {\n singlePointerPool.release(signal);\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport { singlePointerPool } from \"./pool.js\";\nimport { createSinglePointerSignal, type SinglePointerSignal } from \"./single-pointer-signal.js\";\n\nexport interface SinglePointerEmitter<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerEmitterOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerEmitter<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<InputSignal> {\n const { pooling = false } = options;\n let current: SinglePointerSignal | null = null;\n\n function acquireSignal(): SinglePointerSignal {\n if (pooling) {\n return singlePointerPool.acquire();\n }\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"mouse\",\n button: \"none\",\n pressure: 0.5,\n });\n }\n\n function releaseCurrentPointer(): void {\n if (current && pooling) {\n singlePointerPool.release(current);\n }\n current = null;\n }\n\n return {\n process: (inputSignal) => {\n const signal = acquireSignal();\n processor(inputSignal, signal);\n releaseCurrentPointer();\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n releaseCurrentPointer();\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","createObjectPool","create","reset","options","initialSize","maxSize","pool","i","item","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","resetSinglePointerSignal","p","singlePointerPool","createSinglePointerEmitter","processor","pooling","current","acquireSignal","releaseCurrentPointer","inputSignal","signal"],"mappings":"aAAA,IAAIA,EAAmB,GAEhB,SAASC,GAA2B,CACzC,OAAOD,CACT,CAEO,SAASE,EAAiBC,EAAkB,CACjDH,EAAWG,CACb,CCEO,SAASC,EACdC,EACAC,EACc,CACd,MAAO,CACL,KAAAD,EACA,MAAAC,EACA,SAAUL,EAAA,EACV,UAAW,YAAY,IAAA,CAAI,CAE/B,CCLO,SAASM,EACdC,EACAC,EACAC,EAA6B,CAAA,EACd,CACf,KAAM,CAAE,YAAAC,EAAc,EAAG,QAAAC,EAAU,KAAQF,EACrCG,EAAY,CAAA,EAElB,QAASC,EAAI,EAAGA,EAAIH,EAAaG,IAC/BD,EAAK,KAAKL,GAAQ,EAGpB,MAAO,CACL,IAAI,MAAO,CACT,OAAOK,EAAK,MACd,EAEA,SAAa,CACX,OAAIA,EAAK,OAAS,EACTA,EAAK,IAAA,EAEPL,EAAA,CACT,EAEA,QAAQO,EAAe,CACjBF,EAAK,OAASD,IAChBH,EAAMM,CAAI,EACVF,EAAK,KAAKE,CAAI,EAElB,CAAA,CAEJ,CCzCO,MAAMC,EAA6B,iBAmBnC,SAASC,EAA0BC,EAA6C,CACrF,OAAOd,EAAaY,EAA4BE,CAAO,CACzD,CAEO,SAASC,GAAwD,CACtE,OAAOF,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,UACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CAEO,SAASG,EAAyBC,EAA8B,CACrEA,EAAE,MAAM,MAAQ,OAChBA,EAAE,MAAM,EAAI,EACZA,EAAE,MAAM,EAAI,EACZA,EAAE,MAAM,MAAQ,EAChBA,EAAE,MAAM,MAAQ,EAChBA,EAAE,MAAM,YAAc,UACtBA,EAAE,MAAM,OAAS,OACjBA,EAAE,MAAM,SAAW,GACnBA,EAAE,UAAY,YAAY,IAAA,CAC5B,CC7CO,MAAMC,EAAoBf,EAC/BY,EACAC,EACA,CACE,YAAa,GACb,QAAS,GAAA,CAEb,ECCO,SAASG,EACdC,EACAd,EAAuC,GACJ,CACnC,KAAM,CAAE,QAAAe,EAAU,EAAA,EAAUf,EAC5B,IAAIgB,EAAsC,KAE1C,SAASC,GAAqC,CAC5C,OAAIF,EACKH,EAAkB,QAAA,EAEpBL,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,QACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CAEA,SAASW,GAA8B,CACjCF,GAAWD,GACbH,EAAkB,QAAQI,CAAO,EAEnCA,EAAU,IACZ,CAEA,MAAO,CACL,QAAUG,GAAgB,CACxB,MAAMC,EAASH,EAAA,EACf,OAAAH,EAAUK,EAAaC,CAAM,EAC7BF,EAAA,EACAF,EAAUI,EACHA,CACT,EACA,IAAI,UAAoB,CACtB,OAAOJ,IAAY,IACrB,EACA,OAAc,CACZE,EAAA,CACF,EACA,SAAgB,CACd,KAAK,MAAA,CACP,CAAA,CAEJ"}
1
+ {"version":3,"file":"emitter-CyT5OiQO.cjs","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/internal/object-pool.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/pool.ts","../src/browser/single-pointer/emitter.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n kind: K;\n value: V;\n deviceId: string;\n createdAt: number;\n updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Signal<\n T[\"kind\"],\n T[\"value\"] & Additional\n>;\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","export interface ObjectPool<T> {\n acquire(): T;\n release(item: T): void;\n readonly size: number;\n}\n\nexport interface ObjectPoolOptions {\n initialSize?: number;\n maxSize?: number;\n}\n\n/**\n * Generic object pool for reusing objects and reducing GC pressure.\n * Useful for high-frequency scenarios like pointer/touch events.\n */\nexport function createObjectPool<T>(\n create: () => T,\n reset: (item: T) => void,\n options: ObjectPoolOptions = {},\n): ObjectPool<T> {\n const { initialSize = 0, maxSize = 100 } = options;\n const pool: T[] = [];\n\n for (let i = 0; i < initialSize; i++) {\n pool.push(create());\n }\n\n return {\n get size() {\n return pool.length;\n },\n\n acquire(): T {\n if (pool.length > 0) {\n return pool.pop()!;\n }\n return create();\n },\n\n release(item: T): void {\n if (pool.length < maxSize) {\n reset(item);\n pool.push(item);\n }\n },\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n\nexport function resetSinglePointerSignal(p: SinglePointerSignal): void {\n p.value.phase = \"move\";\n p.value.x = 0;\n p.value.y = 0;\n p.value.pageX = 0;\n p.value.pageY = 0;\n p.value.pointerType = \"unknown\";\n p.value.button = \"none\";\n p.value.pressure = 0.5;\n p.updatedAt = performance.now();\n}\n","import { createObjectPool } from \"../../internal/object-pool.js\";\nimport {\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\n\nexport const singlePointerPool = createObjectPool<SinglePointerSignal>(\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n {\n initialSize: 20,\n maxSize: 100,\n },\n);\n\nexport function releaseSinglePointer(signal: SinglePointerSignal): void {\n singlePointerPool.release(signal);\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport { singlePointerPool } from \"./pool.js\";\nimport { createSinglePointerSignal, type SinglePointerSignal } from \"./single-pointer-signal.js\";\n\nexport interface SinglePointerEmitter<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerEmitterOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerEmitter<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<InputSignal> {\n const { pooling = false } = options;\n let current: SinglePointerSignal | null = null;\n\n function acquireSignal(): SinglePointerSignal {\n if (pooling) {\n return singlePointerPool.acquire();\n }\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"mouse\",\n button: \"none\",\n pressure: 0.5,\n });\n }\n\n function releaseCurrentPointer(): void {\n if (current && pooling) {\n singlePointerPool.release(current);\n }\n current = null;\n }\n\n return {\n process: (inputSignal) => {\n const signal = acquireSignal();\n processor(inputSignal, signal);\n releaseCurrentPointer();\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n releaseCurrentPointer();\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","createObjectPool","create","reset","options","initialSize","maxSize","pool","i","item","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","resetSinglePointerSignal","p","singlePointerPool","createSinglePointerEmitter","processor","pooling","current","acquireSignal","releaseCurrentPointer","inputSignal","signal"],"mappings":"aAAA,IAAIA,EAAmB,GAEhB,SAASC,GAA2B,CACzC,OAAOD,CACT,CAEO,SAASE,EAAiBC,EAAkB,CACjDH,EAAWG,CACb,CCiBO,SAASC,EACdC,EACAC,EACc,CACd,MAAO,CACL,KAAAD,EACA,MAAAC,EACA,SAAUL,EAAA,EACV,UAAW,YAAY,IAAA,CAAI,CAE/B,CCpBO,SAASM,EACdC,EACAC,EACAC,EAA6B,CAAA,EACd,CACf,KAAM,CAAE,YAAAC,EAAc,EAAG,QAAAC,EAAU,KAAQF,EACrCG,EAAY,CAAA,EAElB,QAASC,EAAI,EAAGA,EAAIH,EAAaG,IAC/BD,EAAK,KAAKL,GAAQ,EAGpB,MAAO,CACL,IAAI,MAAO,CACT,OAAOK,EAAK,MACd,EAEA,SAAa,CACX,OAAIA,EAAK,OAAS,EACTA,EAAK,IAAA,EAEPL,EAAA,CACT,EAEA,QAAQO,EAAe,CACjBF,EAAK,OAASD,IAChBH,EAAMM,CAAI,EACVF,EAAK,KAAKE,CAAI,EAElB,CAAA,CAEJ,CCzCO,MAAMC,EAA6B,iBAmBnC,SAASC,EAA0BC,EAA6C,CACrF,OAAOd,EAAaY,EAA4BE,CAAO,CACzD,CAEO,SAASC,GAAwD,CACtE,OAAOF,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,UACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CAEO,SAASG,EAAyBC,EAA8B,CACrEA,EAAE,MAAM,MAAQ,OAChBA,EAAE,MAAM,EAAI,EACZA,EAAE,MAAM,EAAI,EACZA,EAAE,MAAM,MAAQ,EAChBA,EAAE,MAAM,MAAQ,EAChBA,EAAE,MAAM,YAAc,UACtBA,EAAE,MAAM,OAAS,OACjBA,EAAE,MAAM,SAAW,GACnBA,EAAE,UAAY,YAAY,IAAA,CAC5B,CC7CO,MAAMC,EAAoBf,EAC/BY,EACAC,EACA,CACE,YAAa,GACb,QAAS,GAAA,CAEb,ECCO,SAASG,EACdC,EACAd,EAAuC,GACJ,CACnC,KAAM,CAAE,QAAAe,EAAU,EAAA,EAAUf,EAC5B,IAAIgB,EAAsC,KAE1C,SAASC,GAAqC,CAC5C,OAAIF,EACKH,EAAkB,QAAA,EAEpBL,EAA0B,CAC/B,GAAI,GACJ,MAAO,OACP,EAAG,EACH,EAAG,EACH,MAAO,EACP,MAAO,EACP,YAAa,QACb,OAAQ,OACR,SAAU,EAAA,CACX,CACH,CAEA,SAASW,GAA8B,CACjCF,GAAWD,GACbH,EAAkB,QAAQI,CAAO,EAEnCA,EAAU,IACZ,CAEA,MAAO,CACL,QAAUG,GAAgB,CACxB,MAAMC,EAASH,EAAA,EACf,OAAAH,EAAUK,EAAaC,CAAM,EAC7BF,EAAA,EACAF,EAAUI,EACHA,CACT,EACA,IAAI,UAAoB,CACtB,OAAOJ,IAAY,IACrB,EACA,OAAc,CACZE,EAAA,CACF,EACA,SAAgB,CACd,KAAK,MAAA,CACP,CAAA,CAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"emitter-FFAuyJ19.js","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/internal/object-pool.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/pool.ts","../src/browser/single-pointer/emitter.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n kind: K;\n value: V;\n deviceId: string;\n createdAt: number;\n updatedAt?: number;\n}\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","export interface ObjectPool<T> {\n acquire(): T;\n release(item: T): void;\n readonly size: number;\n}\n\nexport interface ObjectPoolOptions {\n initialSize?: number;\n maxSize?: number;\n}\n\n/**\n * Generic object pool for reusing objects and reducing GC pressure.\n * Useful for high-frequency scenarios like pointer/touch events.\n */\nexport function createObjectPool<T>(\n create: () => T,\n reset: (item: T) => void,\n options: ObjectPoolOptions = {},\n): ObjectPool<T> {\n const { initialSize = 0, maxSize = 100 } = options;\n const pool: T[] = [];\n\n for (let i = 0; i < initialSize; i++) {\n pool.push(create());\n }\n\n return {\n get size() {\n return pool.length;\n },\n\n acquire(): T {\n if (pool.length > 0) {\n return pool.pop()!;\n }\n return create();\n },\n\n release(item: T): void {\n if (pool.length < maxSize) {\n reset(item);\n pool.push(item);\n }\n },\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n\nexport function resetSinglePointerSignal(p: SinglePointerSignal): void {\n p.value.phase = \"move\";\n p.value.x = 0;\n p.value.y = 0;\n p.value.pageX = 0;\n p.value.pageY = 0;\n p.value.pointerType = \"unknown\";\n p.value.button = \"none\";\n p.value.pressure = 0.5;\n p.updatedAt = performance.now();\n}\n","import { createObjectPool } from \"../../internal/object-pool.js\";\nimport {\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\n\nexport const singlePointerPool = createObjectPool<SinglePointerSignal>(\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n {\n initialSize: 20,\n maxSize: 100,\n },\n);\n\nexport function releaseSinglePointer(signal: SinglePointerSignal): void {\n singlePointerPool.release(signal);\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport { singlePointerPool } from \"./pool.js\";\nimport { createSinglePointerSignal, type SinglePointerSignal } from \"./single-pointer-signal.js\";\n\nexport interface SinglePointerEmitter<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerEmitterOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerEmitter<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<InputSignal> {\n const { pooling = false } = options;\n let current: SinglePointerSignal | null = null;\n\n function acquireSignal(): SinglePointerSignal {\n if (pooling) {\n return singlePointerPool.acquire();\n }\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"mouse\",\n button: \"none\",\n pressure: 0.5,\n });\n }\n\n function releaseCurrentPointer(): void {\n if (current && pooling) {\n singlePointerPool.release(current);\n }\n current = null;\n }\n\n return {\n process: (inputSignal) => {\n const signal = acquireSignal();\n processor(inputSignal, signal);\n releaseCurrentPointer();\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n releaseCurrentPointer();\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","createObjectPool","create","reset","options","initialSize","maxSize","pool","i","item","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","resetSinglePointerSignal","p","singlePointerPool","createSinglePointerEmitter","processor","pooling","current","acquireSignal","releaseCurrentPointer","inputSignal","signal"],"mappings":"AAAA,IAAIA,IAAmB;AAEhB,SAASC,IAA2B;AACzC,SAAOD;AACT;AAEO,SAASE,EAAiBC,GAAkB;AACjD,EAAAH,IAAWG;AACb;ACEO,SAASC,EACdC,GACAC,GACc;AACd,SAAO;AAAA,IACL,MAAAD;AAAA,IACA,OAAAC;AAAA,IACA,UAAUL,EAAA;AAAA,IACV,WAAW,YAAY,IAAA;AAAA,EAAI;AAE/B;ACLO,SAASM,EACdC,GACAC,GACAC,IAA6B,CAAA,GACd;AACf,QAAM,EAAE,aAAAC,IAAc,GAAG,SAAAC,IAAU,QAAQF,GACrCG,IAAY,CAAA;AAElB,WAASC,IAAI,GAAGA,IAAIH,GAAaG;AAC/B,IAAAD,EAAK,KAAKL,GAAQ;AAGpB,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAOK,EAAK;AAAA,IACd;AAAA,IAEA,UAAa;AACX,aAAIA,EAAK,SAAS,IACTA,EAAK,IAAA,IAEPL,EAAA;AAAA,IACT;AAAA,IAEA,QAAQO,GAAe;AACrB,MAAIF,EAAK,SAASD,MAChBH,EAAMM,CAAI,GACVF,EAAK,KAAKE,CAAI;AAAA,IAElB;AAAA,EAAA;AAEJ;ACzCO,MAAMC,IAA6B;AAmBnC,SAASC,EAA0BC,GAA6C;AACrF,SAAOd,EAAaY,GAA4BE,CAAO;AACzD;AAEO,SAASC,IAAwD;AACtE,SAAOF,EAA0B;AAAA,IAC/B,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA,CACX;AACH;AAEO,SAASG,EAAyBC,GAA8B;AACrE,EAAAA,EAAE,MAAM,QAAQ,QAChBA,EAAE,MAAM,IAAI,GACZA,EAAE,MAAM,IAAI,GACZA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,cAAc,WACtBA,EAAE,MAAM,SAAS,QACjBA,EAAE,MAAM,WAAW,KACnBA,EAAE,YAAY,YAAY,IAAA;AAC5B;AC7CO,MAAMC,IAAoBf;AAAA,EAC/BY;AAAA,EACAC;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,SAAS;AAAA,EAAA;AAEb;ACCO,SAASG,EACdC,GACAd,IAAuC,IACJ;AACnC,QAAM,EAAE,SAAAe,IAAU,GAAA,IAAUf;AAC5B,MAAIgB,IAAsC;AAE1C,WAASC,IAAqC;AAC5C,WAAIF,IACKH,EAAkB,QAAA,IAEpBL,EAA0B;AAAA,MAC/B,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AAEA,WAASW,IAA8B;AACrC,IAAIF,KAAWD,KACbH,EAAkB,QAAQI,CAAO,GAEnCA,IAAU;AAAA,EACZ;AAEA,SAAO;AAAA,IACL,SAAS,CAACG,MAAgB;AACxB,YAAMC,IAASH,EAAA;AACf,aAAAH,EAAUK,GAAaC,CAAM,GAC7BF,EAAA,GACAF,IAAUI,GACHA;AAAA,IACT;AAAA,IACA,IAAI,WAAoB;AACtB,aAAOJ,MAAY;AAAA,IACrB;AAAA,IACA,QAAc;AACZ,MAAAE,EAAA;AAAA,IACF;AAAA,IACA,UAAgB;AACd,WAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"emitter-FFAuyJ19.js","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/internal/object-pool.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/pool.ts","../src/browser/single-pointer/emitter.ts"],"sourcesContent":["let deviceId: string = \"\";\n\nexport function getCerebDeviceId(): string {\n return deviceId;\n}\n\nexport function setCerebDeviceId(id: string): void {\n deviceId = id;\n}\n","import { getCerebDeviceId } from \"./meta.js\";\n\nexport interface Signal<K extends string = string, V = unknown> {\n kind: K;\n value: V;\n deviceId: string;\n createdAt: number;\n updatedAt?: number;\n}\n\n/**\n * Utility type to extend a Signal's value type with additional properties.\n * Used by operators that add computed properties to signals.\n */\nexport type ExtendSignalValue<T extends Signal, Additional> = Signal<\n T[\"kind\"],\n T[\"value\"] & Additional\n>;\n\n/**\n * Utility type to constrain a Signal to have specific value properties.\n * Used by operators that require certain properties in the input signal.\n */\nexport type SignalWith<V> = Signal<string, V>;\n\nexport function createSignal<K extends string = string, V = unknown>(\n kind: K,\n value: V,\n): Signal<K, V> {\n return {\n kind,\n value,\n deviceId: getCerebDeviceId(),\n createdAt: performance.now(),\n };\n}\n","export interface ObjectPool<T> {\n acquire(): T;\n release(item: T): void;\n readonly size: number;\n}\n\nexport interface ObjectPoolOptions {\n initialSize?: number;\n maxSize?: number;\n}\n\n/**\n * Generic object pool for reusing objects and reducing GC pressure.\n * Useful for high-frequency scenarios like pointer/touch events.\n */\nexport function createObjectPool<T>(\n create: () => T,\n reset: (item: T) => void,\n options: ObjectPoolOptions = {},\n): ObjectPool<T> {\n const { initialSize = 0, maxSize = 100 } = options;\n const pool: T[] = [];\n\n for (let i = 0; i < initialSize; i++) {\n pool.push(create());\n }\n\n return {\n get size() {\n return pool.length;\n },\n\n acquire(): T {\n if (pool.length > 0) {\n return pool.pop()!;\n }\n return create();\n },\n\n release(item: T): void {\n if (pool.length < maxSize) {\n reset(item);\n pool.push(item);\n }\n },\n };\n}\n","import { createSignal, type Signal } from \"../../core/signal.js\";\nimport type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from \"./types.js\";\n\nexport interface SinglePointerSignal extends Signal<\"single-pointer\", SinglePointer> {}\n\nexport const SINGLE_POINTER_SIGNAL_KIND = \"single-pointer\" as const;\n\n/**\n * Normalized pointer data representing a single point of contact.\n * Abstracts away differences between mouse, touch, and pointer events.\n */\nexport interface SinglePointer {\n phase: SinglePointerPhase;\n x: number;\n y: number;\n pageX: number;\n pageY: number;\n pointerType: SinglePointerType;\n button: SinglePointerButton;\n /** 0.0 ~ 1.0, default 0.5 if unsupported */\n pressure: number;\n id: string;\n}\n\nexport function createSinglePointerSignal(pointer: SinglePointer): SinglePointerSignal {\n return createSignal(SINGLE_POINTER_SIGNAL_KIND, pointer);\n}\n\nexport function createDefaultSinglePointerSignal(): SinglePointerSignal {\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"unknown\",\n button: \"none\",\n pressure: 0.5,\n });\n}\n\nexport function resetSinglePointerSignal(p: SinglePointerSignal): void {\n p.value.phase = \"move\";\n p.value.x = 0;\n p.value.y = 0;\n p.value.pageX = 0;\n p.value.pageY = 0;\n p.value.pointerType = \"unknown\";\n p.value.button = \"none\";\n p.value.pressure = 0.5;\n p.updatedAt = performance.now();\n}\n","import { createObjectPool } from \"../../internal/object-pool.js\";\nimport {\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\n\nexport const singlePointerPool = createObjectPool<SinglePointerSignal>(\n createDefaultSinglePointerSignal,\n resetSinglePointerSignal,\n {\n initialSize: 20,\n maxSize: 100,\n },\n);\n\nexport function releaseSinglePointer(signal: SinglePointerSignal): void {\n singlePointerPool.release(signal);\n}\n","import type { Signal } from \"../../core/signal.js\";\nimport { singlePointerPool } from \"./pool.js\";\nimport { createSinglePointerSignal, type SinglePointerSignal } from \"./single-pointer-signal.js\";\n\nexport interface SinglePointerEmitter<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerEmitterOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerEmitter<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<InputSignal> {\n const { pooling = false } = options;\n let current: SinglePointerSignal | null = null;\n\n function acquireSignal(): SinglePointerSignal {\n if (pooling) {\n return singlePointerPool.acquire();\n }\n return createSinglePointerSignal({\n id: \"\",\n phase: \"move\",\n x: 0,\n y: 0,\n pageX: 0,\n pageY: 0,\n pointerType: \"mouse\",\n button: \"none\",\n pressure: 0.5,\n });\n }\n\n function releaseCurrentPointer(): void {\n if (current && pooling) {\n singlePointerPool.release(current);\n }\n current = null;\n }\n\n return {\n process: (inputSignal) => {\n const signal = acquireSignal();\n processor(inputSignal, signal);\n releaseCurrentPointer();\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n releaseCurrentPointer();\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","createObjectPool","create","reset","options","initialSize","maxSize","pool","i","item","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","resetSinglePointerSignal","p","singlePointerPool","createSinglePointerEmitter","processor","pooling","current","acquireSignal","releaseCurrentPointer","inputSignal","signal"],"mappings":"AAAA,IAAIA,IAAmB;AAEhB,SAASC,IAA2B;AACzC,SAAOD;AACT;AAEO,SAASE,EAAiBC,GAAkB;AACjD,EAAAH,IAAWG;AACb;ACiBO,SAASC,EACdC,GACAC,GACc;AACd,SAAO;AAAA,IACL,MAAAD;AAAA,IACA,OAAAC;AAAA,IACA,UAAUL,EAAA;AAAA,IACV,WAAW,YAAY,IAAA;AAAA,EAAI;AAE/B;ACpBO,SAASM,EACdC,GACAC,GACAC,IAA6B,CAAA,GACd;AACf,QAAM,EAAE,aAAAC,IAAc,GAAG,SAAAC,IAAU,QAAQF,GACrCG,IAAY,CAAA;AAElB,WAASC,IAAI,GAAGA,IAAIH,GAAaG;AAC/B,IAAAD,EAAK,KAAKL,GAAQ;AAGpB,SAAO;AAAA,IACL,IAAI,OAAO;AACT,aAAOK,EAAK;AAAA,IACd;AAAA,IAEA,UAAa;AACX,aAAIA,EAAK,SAAS,IACTA,EAAK,IAAA,IAEPL,EAAA;AAAA,IACT;AAAA,IAEA,QAAQO,GAAe;AACrB,MAAIF,EAAK,SAASD,MAChBH,EAAMM,CAAI,GACVF,EAAK,KAAKE,CAAI;AAAA,IAElB;AAAA,EAAA;AAEJ;ACzCO,MAAMC,IAA6B;AAmBnC,SAASC,EAA0BC,GAA6C;AACrF,SAAOd,EAAaY,GAA4BE,CAAO;AACzD;AAEO,SAASC,IAAwD;AACtE,SAAOF,EAA0B;AAAA,IAC/B,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,UAAU;AAAA,EAAA,CACX;AACH;AAEO,SAASG,EAAyBC,GAA8B;AACrE,EAAAA,EAAE,MAAM,QAAQ,QAChBA,EAAE,MAAM,IAAI,GACZA,EAAE,MAAM,IAAI,GACZA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,QAAQ,GAChBA,EAAE,MAAM,cAAc,WACtBA,EAAE,MAAM,SAAS,QACjBA,EAAE,MAAM,WAAW,KACnBA,EAAE,YAAY,YAAY,IAAA;AAC5B;AC7CO,MAAMC,IAAoBf;AAAA,EAC/BY;AAAA,EACAC;AAAA,EACA;AAAA,IACE,aAAa;AAAA,IACb,SAAS;AAAA,EAAA;AAEb;ACCO,SAASG,EACdC,GACAd,IAAuC,IACJ;AACnC,QAAM,EAAE,SAAAe,IAAU,GAAA,IAAUf;AAC5B,MAAIgB,IAAsC;AAE1C,WAASC,IAAqC;AAC5C,WAAIF,IACKH,EAAkB,QAAA,IAEpBL,EAA0B;AAAA,MAC/B,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA,CACX;AAAA,EACH;AAEA,WAASW,IAA8B;AACrC,IAAIF,KAAWD,KACbH,EAAkB,QAAQI,CAAO,GAEnCA,IAAU;AAAA,EACZ;AAEA,SAAO;AAAA,IACL,SAAS,CAACG,MAAgB;AACxB,YAAMC,IAASH,EAAA;AACf,aAAAH,EAAUK,GAAaC,CAAM,GAC7BF,EAAA,GACAF,IAAUI,GACHA;AAAA,IACT;AAAA,IACA,IAAI,WAAoB;AACtB,aAAOJ,MAAY;AAAA,IACrB;AAAA,IACA,QAAc;AACZ,MAAAE,EAAA;AAAA,IACF;AAAA,IACA,UAAgB;AACd,WAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAEJ;"}
@@ -4,6 +4,7 @@ export { distinctUntilChanged, distinctUntilKeyChanged } from './distinct.js';
4
4
  export { filter } from './filter.js';
5
5
  export { map } from './map.js';
6
6
  export { merge, mergeWith } from './merge.js';
7
+ export { offset } from './offset.js';
7
8
  export { share, shareReplay } from './share.js';
8
9
  export { skip, skipUntil, skipWhile } from './skip.js';
9
10
  export { spy, tap } from './spy.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ExtendSignalValue, SignalWith } from '../core/signal.js';
2
+ import { Operator } from '../core/stream.js';
3
+ export interface OffsetOptions {
4
+ target: Element;
5
+ manual?: boolean;
6
+ }
7
+ export interface PointerValue {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ export interface OffsetValue {
12
+ offsetX: number;
13
+ offsetY: number;
14
+ }
15
+ export type OffsetOperatorResult<T extends SignalWith<PointerValue>> = ExtendSignalValue<T, OffsetValue>;
16
+ export interface OffsetOperator<T extends SignalWith<PointerValue>> extends Operator<T, ExtendSignalValue<T, OffsetValue>> {
17
+ recalculate(): void;
18
+ }
19
+ /**
20
+ * Creates an operator that adds element-relative offset coordinates to pointer signals.
21
+ * Uses getBoundingClientRect() to calculate offsetX and offsetY relative to the target element.
22
+ */
23
+ export declare function offset<T extends SignalWith<PointerValue>>(options: OffsetOptions): OffsetOperator<T>;
24
+ //# sourceMappingURL=offset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offset.d.ts","sourceRoot":"","sources":["../../src/operators/offset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,UAAU,CAAC,YAAY,CAAC,IAAI,iBAAiB,CACtF,CAAC,EACD,WAAW,CACZ,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,UAAU,CAAC,YAAY,CAAC,CAChE,SAAQ,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACtD,WAAW,IAAI,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,UAAU,CAAC,YAAY,CAAC,EACvD,OAAO,EAAE,aAAa,GACrB,cAAc,CAAC,CAAC,CAAC,CAmDnB"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./stream-Cp6eCZs2.cjs");function b(u){return r=>i.createStream(e=>{let t=[];return r.subscribe({next(n){t.push(n),t.length>=u&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])},error:e.error?.bind(e),complete(){t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}})})}function x(u){return r=>i.createStream(e=>{let t=[];const n=setInterval(()=>{t.length>0&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])},u),c=r.subscribe({next(l){t.push(l)},error:e.error?.bind(e),complete(){clearInterval(n),t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}});return()=>{clearInterval(n),c()}})}function h(u){return r=>i.createStream(e=>{let t=[];const n=u.subscribe(()=>{t.length>0&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])}),c=r.subscribe({next(l){t.push(l)},error:e.error?.bind(e),complete(){n(),t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}});return()=>{n(),c()}})}function k(u){return r=>i.createStream(e=>{let t=null;const n=r.subscribe({next(c){t!==null&&clearTimeout(t),t=setTimeout(()=>{t=null,e.next(c)},u)},error:e.error?.bind(e),complete(){t!==null&&clearTimeout(t),e.complete?.()}});return()=>{t!==null&&clearTimeout(t),n()}})}function S(u){const r=u??((e,t)=>e.value===t.value);return e=>i.createStream(t=>{let n=!1,c;return e.subscribe({next(l){(!n||!r(c,l))&&(n=!0,c=l,t.next(l))},error:t.error?.bind(t),complete:t.complete?.bind(t)})})}function g(u,r){const e=r??((t,n)=>t===n);return t=>i.createStream(n=>{let c=!1,l;return t.subscribe({next(o){const a=u(o);(!c||!e(l,a))&&(c=!0,l=a,n.next(o))},error:n.error?.bind(n),complete:n.complete?.bind(n)})})}function U(u){return r=>i.createStream(e=>r.subscribe({next(t){try{u(t)&&e.next(t)}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}function y(u){return r=>i.createStream(e=>r.subscribe({next(t){try{e.next(u(t))}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}function I(u){return r=>i.createStream(e=>{let t=0;const n=()=>{t++,t===2&&e.complete?.()},c=r.subscribe({next:o=>e.next(o),error:e.error?.bind(e),complete:n}),l=u.subscribe({next:o=>e.next(o),error:e.error?.bind(e),complete:n});return()=>{c(),l()}})}function T(...u){return i.createStream(r=>{let e=0;const t=u.map(n=>n.subscribe({next:c=>r.next(c),error:r.error?.bind(r),complete:()=>{e++,e===u.length&&r.complete?.()}}));return()=>{for(const n of t)n()}})}function w(){return u=>{const r=new Set;let e=null,t=!1;return{get isBlocked(){return t},block(){t=!0},unblock(){t=!1},subscribe(n){const c=i.toObserver(n);return r.add(c),r.size===1&&(e=u.subscribe({next(l){if(!t)for(const o of r)o.next(l)},error(l){for(const o of r)o.error?.(l)},complete(){for(const l of r)l.complete?.();r.clear(),e=null}})),()=>{r.delete(c),r.size===0&&e&&(e(),e=null)}}}}}function A(u=1){return r=>{const e=[],t=new Set;let n=null,c=!1,l=!1,o,a=!1;return{get isBlocked(){return a},block(){a=!0},unblock(){a=!1},subscribe(p){const s=i.toObserver(p);for(const f of e)s.next(f);return c?(s.complete?.(),()=>{}):l?(s.error?.(o),()=>{}):(t.add(s),t.size===1&&!n&&(n=r.subscribe({next(f){if(e.push(f),e.length>u&&e.shift(),!a)for(const m of t)m.next(f)},error(f){l=!0,o=f;for(const m of t)m.error?.(f);t.clear(),n=null},complete(){c=!0;for(const f of t)f.complete?.();t.clear(),n=null}})),()=>{t.delete(s),t.size===0&&n&&!c&&!l&&(n(),n=null)})}}}}function W(u){return r=>i.createStream(e=>{let t=0;return r.subscribe({next(n){t<u?t++:e.next(n)},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function C(u){return r=>i.createStream(e=>{let t=!0;return r.subscribe({next(n){t&&!u(n)&&(t=!1),t||e.next(n)},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function D(u){return r=>i.createStream(e=>{let t=!0;const n=u.subscribe(()=>{t=!1,n()}),c=r.subscribe({next(l){t||e.next(l)},error:e.error?.bind(e),complete:e.complete?.bind(e)});return()=>{n(),c()}})}function d(u){return r=>i.createStream(e=>r.subscribe({next(t){try{u(t),e.next(t)}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}const z=d;function L(u){return r=>i.createStream(e=>{let t=0,n;return n=r.subscribe({next(c){t<u&&(t++,e.next(c),t>=u&&(e.complete?.(),n?.()))},error:e.error?.bind(e),complete:e.complete?.bind(e)}),()=>n?.()})}function V(u){return r=>i.createStream(e=>{let t;return t=r.subscribe({next(n){u(n)?e.next(n):(e.complete?.(),t?.())},error:e.error?.bind(e),complete:e.complete?.bind(e)}),()=>t?.()})}function q(u){return r=>i.createStream(e=>{let t=!1;const n=u.subscribe(()=>{t||(t=!0,e.complete?.(),l())}),c=r.subscribe({next(o){t||e.next(o)},error:e.error?.bind(e),complete(){t||(t=!0,e.complete?.())}}),l=()=>{n(),c()};return l})}function E(u){return r=>i.createStream(e=>{let t=null;return r.subscribe({next(n){const c=performance.now();(t===null||c-t>=u)&&(t=c,e.next(n))},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function K(u){return r=>i.createStream(e=>{let t,n=!1,c=null;const l=r.subscribe({next(o){t=o,n=!0,c===null&&(c=setTimeout(()=>{n&&(e.next(t),n=!1),c=null},u))},error:e.error?.bind(e),complete(){c!==null&&(clearTimeout(c),n&&e.next(t)),e.complete?.()}});return()=>{c!==null&&clearTimeout(c),l()}})}exports.buffer=b;exports.bufferTime=x;exports.bufferWhen=h;exports.debounce=k;exports.distinctUntilChanged=S;exports.distinctUntilKeyChanged=g;exports.filter=U;exports.map=y;exports.merge=T;exports.mergeWith=I;exports.share=w;exports.shareReplay=A;exports.skip=W;exports.skipUntil=D;exports.skipWhile=C;exports.spy=d;exports.take=L;exports.takeUntil=q;exports.takeWhile=V;exports.tap=z;exports.throttle=E;exports.throttleLast=K;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./stream-Cp6eCZs2.cjs");function b(c){return r=>i.createStream(e=>{let t=[];return r.subscribe({next(n){t.push(n),t.length>=c&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])},error:e.error?.bind(e),complete(){t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}})})}function x(c){return r=>i.createStream(e=>{let t=[];const n=setInterval(()=>{t.length>0&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])},c),u=r.subscribe({next(l){t.push(l)},error:e.error?.bind(e),complete(){clearInterval(n),t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}});return()=>{clearInterval(n),u()}})}function h(c){return r=>i.createStream(e=>{let t=[];const n=c.subscribe(()=>{t.length>0&&(e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),t=[])}),u=r.subscribe({next(l){t.push(l)},error:e.error?.bind(e),complete(){n(),t.length>0&&e.next({kind:"buffer",value:t,deviceId:"",createdAt:Date.now()}),e.complete?.()}});return()=>{n(),u()}})}function k(c){return r=>i.createStream(e=>{let t=null;const n=r.subscribe({next(u){t!==null&&clearTimeout(t),t=setTimeout(()=>{t=null,e.next(u)},c)},error:e.error?.bind(e),complete(){t!==null&&clearTimeout(t),e.complete?.()}});return()=>{t!==null&&clearTimeout(t),n()}})}function g(c){const r=c??((e,t)=>e.value===t.value);return e=>i.createStream(t=>{let n=!1,u;return e.subscribe({next(l){(!n||!r(u,l))&&(n=!0,u=l,t.next(l))},error:t.error?.bind(t),complete:t.complete?.bind(t)})})}function S(c,r){const e=r??((t,n)=>t===n);return t=>i.createStream(n=>{let u=!1,l;return t.subscribe({next(o){const f=c(o);(!u||!e(l,f))&&(u=!0,l=f,n.next(o))},error:n.error?.bind(n),complete:n.complete?.bind(n)})})}function U(c){return r=>i.createStream(e=>r.subscribe({next(t){try{c(t)&&e.next(t)}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}function y(c){return r=>i.createStream(e=>r.subscribe({next(t){try{e.next(c(t))}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}function w(c){return r=>i.createStream(e=>{let t=0;const n=()=>{t++,t===2&&e.complete?.()},u=r.subscribe({next:o=>e.next(o),error:e.error?.bind(e),complete:n}),l=c.subscribe({next:o=>e.next(o),error:e.error?.bind(e),complete:n});return()=>{u(),l()}})}function I(...c){return i.createStream(r=>{let e=0;const t=c.map(n=>n.subscribe({next:u=>r.next(u),error:r.error?.bind(r),complete:()=>{e++,e===c.length&&r.complete?.()}}));return()=>{for(const n of t)n()}})}function T(c){const{target:r,manual:e=!1}=c;if(!r)throw new Error("offset operator requires a valid target element");let t=null;function n(){return e&&t||(t=r.getBoundingClientRect()),t}function u(){t=r.getBoundingClientRect()}const l=o=>i.createStream(f=>{const d=o.subscribe({next(s){try{const a=n(),m=s.value;m.offsetX=m.x-a.left,m.offsetY=m.y-a.top,f.next(s)}catch(a){f.error?.(a)}},error:f.error?.bind(f),complete(){f.complete?.()}});return()=>{d()}});return l.recalculate=u,l}function A(){return c=>{const r=new Set;let e=null,t=!1;return{get isBlocked(){return t},block(){t=!0},unblock(){t=!1},subscribe(n){const u=i.toObserver(n);return r.add(u),r.size===1&&(e=c.subscribe({next(l){if(!t)for(const o of r)o.next(l)},error(l){for(const o of r)o.error?.(l)},complete(){for(const l of r)l.complete?.();r.clear(),e=null}})),()=>{r.delete(u),r.size===0&&e&&(e(),e=null)}}}}}function C(c=1){return r=>{const e=[],t=new Set;let n=null,u=!1,l=!1,o,f=!1;return{get isBlocked(){return f},block(){f=!0},unblock(){f=!1},subscribe(d){const s=i.toObserver(d);for(const a of e)s.next(a);return u?(s.complete?.(),()=>{}):l?(s.error?.(o),()=>{}):(t.add(s),t.size===1&&!n&&(n=r.subscribe({next(a){if(e.push(a),e.length>c&&e.shift(),!f)for(const m of t)m.next(a)},error(a){l=!0,o=a;for(const m of t)m.error?.(a);t.clear(),n=null},complete(){u=!0;for(const a of t)a.complete?.();t.clear(),n=null}})),()=>{t.delete(s),t.size===0&&n&&!u&&!l&&(n(),n=null)})}}}}function W(c){return r=>i.createStream(e=>{let t=0;return r.subscribe({next(n){t<c?t++:e.next(n)},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function D(c){return r=>i.createStream(e=>{let t=!0;return r.subscribe({next(n){t&&!c(n)&&(t=!1),t||e.next(n)},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function R(c){return r=>i.createStream(e=>{let t=!0;const n=c.subscribe(()=>{t=!1,n()}),u=r.subscribe({next(l){t||e.next(l)},error:e.error?.bind(e),complete:e.complete?.bind(e)});return()=>{n(),u()}})}function p(c){return r=>i.createStream(e=>r.subscribe({next(t){try{c(t),e.next(t)}catch(n){e.error?.(n)}},error:e.error?.bind(e),complete:e.complete?.bind(e)}))}const q=p;function z(c){return r=>i.createStream(e=>{let t=0,n;return n=r.subscribe({next(u){t<c&&(t++,e.next(u),t>=c&&(e.complete?.(),n?.()))},error:e.error?.bind(e),complete:e.complete?.bind(e)}),()=>n?.()})}function B(c){return r=>i.createStream(e=>{let t;return t=r.subscribe({next(n){c(n)?e.next(n):(e.complete?.(),t?.())},error:e.error?.bind(e),complete:e.complete?.bind(e)}),()=>t?.()})}function E(c){return r=>i.createStream(e=>{let t=!1;const n=c.subscribe(()=>{t||(t=!0,e.complete?.(),l())}),u=r.subscribe({next(o){t||e.next(o)},error:e.error?.bind(e),complete(){t||(t=!0,e.complete?.())}}),l=()=>{n(),u()};return l})}function L(c){return r=>i.createStream(e=>{let t=null;return r.subscribe({next(n){const u=performance.now();(t===null||u-t>=c)&&(t=u,e.next(n))},error:e.error?.bind(e),complete:e.complete?.bind(e)})})}function V(c){return r=>i.createStream(e=>{let t,n=!1,u=null;const l=r.subscribe({next(o){t=o,n=!0,u===null&&(u=setTimeout(()=>{n&&(e.next(t),n=!1),u=null},c))},error:e.error?.bind(e),complete(){u!==null&&(clearTimeout(u),n&&e.next(t)),e.complete?.()}});return()=>{u!==null&&clearTimeout(u),l()}})}exports.buffer=b;exports.bufferTime=x;exports.bufferWhen=h;exports.debounce=k;exports.distinctUntilChanged=g;exports.distinctUntilKeyChanged=S;exports.filter=U;exports.map=y;exports.merge=I;exports.mergeWith=w;exports.offset=T;exports.share=A;exports.shareReplay=C;exports.skip=W;exports.skipUntil=R;exports.skipWhile=D;exports.spy=p;exports.take=z;exports.takeUntil=E;exports.takeWhile=B;exports.tap=q;exports.throttle=L;exports.throttleLast=V;
2
2
  //# sourceMappingURL=operators.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"operators.cjs","sources":["../src/operators/buffer.ts","../src/operators/debounce.ts","../src/operators/distinct.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/share.ts","../src/operators/skip.ts","../src/operators/spy.ts","../src/operators/take.ts","../src/operators/throttle.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function buffer<T extends Signal>(count: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n return source.subscribe({\n next(value) {\n bufferArr.push(value);\n if (bufferArr.length >= count) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n });\n}\n\nexport function bufferTime<T extends Signal>(ms: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const intervalId = setInterval(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n }, ms);\n\n const unsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n clearInterval(intervalId);\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n clearInterval(intervalId);\n unsub();\n };\n });\n}\n\nexport function bufferWhen<T extends Signal>(\n notifier: Stream<Signal>,\n): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const notifierUnsub = notifier.subscribe(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n notifierUnsub();\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Emits values only when they differ from the previous emitted value.\n *\n * In event/gesture pipelines, this is useful when you only want to react to\n * meaningful changes (e.g. pointer coordinates changed, delta changed, a state transition happened).\n *\n * The default comparison is based on Signal's value property using `===`.\n * For objects/arrays, provide `compare` to avoid treating freshly-created but equivalent values as \"changed\".\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n * import { map } from \"./map.js\";\n *\n * // Only emit when the pointer position actually changes\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * map((e) => ({ x: e.clientX, y: e.clientY })),\n * distinctUntilChanged((a, b) => a.value.x === b.value.x && a.value.y === b.value.y),\n * ).subscribe(({ x, y }) => {\n * // Called only when (x, y) changes\n * });\n * ```\n */\nexport function distinctUntilChanged<T extends Signal>(\n compare?: (prev: T, curr: T) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: T, b: T) => a.value === b.value);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastValue: T;\n\n return source.subscribe({\n next(value) {\n if (!hasLast || !isEqual(lastValue, value)) {\n hasLast = true;\n lastValue = value;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/**\n * Like `distinctUntilChanged`, but compares a derived key instead of the entire value.\n *\n * This is convenient for gesture events when reacting to state transitions,\n * such as changes in `phase`.\n *\n * @example\n * ```typescript\n * import { pipe } from \"../pipe.js\";\n *\n * // Emit only when the gesture phase changes (start/change/end/cancel)\n * pipe(\n * pan(element),\n * distinctUntilKeyChanged((e) => e.value.phase),\n * ).subscribe((e) => {\n * // Consecutive identical phases are skipped; only transitions arrive here\n * });\n * ```\n */\nexport function distinctUntilKeyChanged<T extends Signal, K>(\n keySelector: (value: T) => K,\n compare?: (prev: K, curr: K) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: K, b: K) => a === b);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastKey: K;\n\n return source.subscribe({\n next(value) {\n const key = keySelector(value);\n if (!hasLast || !isEqual(lastKey, key)) {\n hasLast = true;\n lastKey = key;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Observer, Operator, Stream, Unsubscribe } from \"../core/stream.js\";\nimport { toObserver } from \"../core/stream.js\";\n\nexport function share<T extends Signal>(): Operator<T, T> {\n return (source): Stream<T> => {\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n observers.add(observer);\n\n if (observers.size === 1) {\n sourceUnsub = source.subscribe({\n next(value) {\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n for (const obs of observers) {\n obs.error?.(err);\n }\n },\n complete() {\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n\nexport function shareReplay<T extends Signal>(bufferSize = 1): Operator<T, T> {\n return (source): Stream<T> => {\n const buffer: T[] = [];\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let completed = false;\n let hasError = false;\n let errorValue: unknown;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n\n for (const value of buffer) {\n observer.next(value);\n }\n\n if (completed) {\n observer.complete?.();\n return () => {};\n }\n if (hasError) {\n observer.error?.(errorValue);\n return () => {};\n }\n\n observers.add(observer);\n\n if (observers.size === 1 && !sourceUnsub) {\n sourceUnsub = source.subscribe({\n next(value) {\n buffer.push(value);\n if (buffer.length > bufferSize) {\n buffer.shift();\n }\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n hasError = true;\n errorValue = err;\n for (const obs of observers) {\n obs.error?.(err);\n }\n observers.clear();\n sourceUnsub = null;\n },\n complete() {\n completed = true;\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub && !completed && !hasError) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function skip<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipped = 0;\n\n return source.subscribe({\n next(value) {\n if (skipped < count) {\n skipped++;\n } else {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n return source.subscribe({\n next(value) {\n if (skipping && !predicate(value)) {\n skipping = false;\n }\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n const notifierUnsub = notifier.subscribe(() => {\n skipping = false;\n notifierUnsub();\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n *\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * ).subscribe();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operators for ending a subscription based on count, a predicate, or a notifier.\n *\n * This is intentionally about **subscription lifecycle** (\"when should this pipeline stop?\"),\n * not about destroying the underlying event source (which may be shared by other subscribers).\n *\n * Common event/gesture patterns:\n * - One-shot trigger: `take(1)`\n * - While a condition holds: `takeWhile(predicate)`\n * - Until an explicit end signal: `takeUntil(end$)` (e.g. move until up/cancel)\n */\nexport function take<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let taken = 0;\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (taken < count) {\n taken++;\n observer.next(value);\n if (taken >= count) {\n observer.complete?.();\n unsub?.();\n }\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits only the first `count` values, then completes and unsubscribes.\n * `take(1)` is especially useful for one-shot triggers.\n */\nexport function takeWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (predicate(value)) {\n observer.next(value);\n } else {\n observer.complete?.();\n unsub?.();\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits values while `predicate(value)` is true, then completes and unsubscribes.\n */\nexport function takeUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let completed = false;\n\n const notifierUnsub = notifier.subscribe(() => {\n if (!completed) {\n completed = true;\n observer.complete?.();\n cleanup();\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!completed) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (!completed) {\n completed = true;\n observer.complete?.();\n }\n },\n });\n\n const cleanup = () => {\n notifierUnsub();\n sourceUnsub();\n };\n\n return cleanup;\n });\n}\n\n/**\n * Completes the source subscription when `notifier` emits, and unsubscribes from both.\n * This is the go-to shape for \"observe from start until end\" event flows.\n */\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.subscribe({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n"],"names":["buffer","count","source","createStream","observer","bufferArr","value","bufferTime","ms","intervalId","unsub","bufferWhen","notifier","notifierUnsub","sourceUnsub","debounce","timeoutId","distinctUntilChanged","compare","isEqual","a","b","hasLast","lastValue","distinctUntilKeyChanged","keySelector","lastKey","key","filter","predicate","err","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","share","observers","blocked","observerOrNext","toObserver","obs","shareReplay","bufferSize","completed","hasError","errorValue","skip","skipped","skipWhile","skipping","skipUntil","spy","fn","tap","take","taken","takeWhile","takeUntil","cleanup","throttle","lastTime","now","throttleLast","hasValue"],"mappings":"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"}
1
+ {"version":3,"file":"operators.cjs","sources":["../src/operators/buffer.ts","../src/operators/debounce.ts","../src/operators/distinct.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/offset.ts","../src/operators/share.ts","../src/operators/skip.ts","../src/operators/spy.ts","../src/operators/take.ts","../src/operators/throttle.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function buffer<T extends Signal>(count: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n return source.subscribe({\n next(value) {\n bufferArr.push(value);\n if (bufferArr.length >= count) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n });\n}\n\nexport function bufferTime<T extends Signal>(ms: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const intervalId = setInterval(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n }, ms);\n\n const unsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n clearInterval(intervalId);\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n clearInterval(intervalId);\n unsub();\n };\n });\n}\n\nexport function bufferWhen<T extends Signal>(\n notifier: Stream<Signal>,\n): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const notifierUnsub = notifier.subscribe(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n notifierUnsub();\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Emits values only when they differ from the previous emitted value.\n *\n * In event/gesture pipelines, this is useful when you only want to react to\n * meaningful changes (e.g. pointer coordinates changed, delta changed, a state transition happened).\n *\n * The default comparison is based on Signal's value property using `===`.\n * For objects/arrays, provide `compare` to avoid treating freshly-created but equivalent values as \"changed\".\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n * import { map } from \"./map.js\";\n *\n * // Only emit when the pointer position actually changes\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * map((e) => ({ x: e.clientX, y: e.clientY })),\n * distinctUntilChanged((a, b) => a.value.x === b.value.x && a.value.y === b.value.y),\n * ).subscribe(({ x, y }) => {\n * // Called only when (x, y) changes\n * });\n * ```\n */\nexport function distinctUntilChanged<T extends Signal>(\n compare?: (prev: T, curr: T) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: T, b: T) => a.value === b.value);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastValue: T;\n\n return source.subscribe({\n next(value) {\n if (!hasLast || !isEqual(lastValue, value)) {\n hasLast = true;\n lastValue = value;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/**\n * Like `distinctUntilChanged`, but compares a derived key instead of the entire value.\n *\n * This is convenient for gesture events when reacting to state transitions,\n * such as changes in `phase`.\n *\n * @example\n * ```typescript\n * import { pipe } from \"../pipe.js\";\n *\n * // Emit only when the gesture phase changes (start/change/end/cancel)\n * pipe(\n * pan(element),\n * distinctUntilKeyChanged((e) => e.value.phase),\n * ).subscribe((e) => {\n * // Consecutive identical phases are skipped; only transitions arrive here\n * });\n * ```\n */\nexport function distinctUntilKeyChanged<T extends Signal, K>(\n keySelector: (value: T) => K,\n compare?: (prev: K, curr: K) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: K, b: K) => a === b);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastKey: K;\n\n return source.subscribe({\n next(value) {\n const key = keySelector(value);\n if (!hasLast || !isEqual(lastKey, key)) {\n hasLast = true;\n lastKey = key;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { ExtendSignalValue, SignalWith } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface OffsetOptions {\n target: Element;\n manual?: boolean;\n}\n\nexport interface PointerValue {\n x: number;\n y: number;\n}\n\nexport interface OffsetValue {\n offsetX: number;\n offsetY: number;\n}\n\nexport type OffsetOperatorResult<T extends SignalWith<PointerValue>> = ExtendSignalValue<\n T,\n OffsetValue\n>;\n\nexport interface OffsetOperator<T extends SignalWith<PointerValue>>\n extends Operator<T, ExtendSignalValue<T, OffsetValue>> {\n recalculate(): void;\n}\n\n/**\n * Creates an operator that adds element-relative offset coordinates to pointer signals.\n * Uses getBoundingClientRect() to calculate offsetX and offsetY relative to the target element.\n */\nexport function offset<T extends SignalWith<PointerValue>>(\n options: OffsetOptions,\n): OffsetOperator<T> {\n const { target, manual = false } = options;\n if (!target) {\n throw new Error(\"offset operator requires a valid target element\");\n }\n\n let cachedRect: DOMRect | null = null;\n\n function getRect(): DOMRect {\n if (manual && cachedRect) {\n return cachedRect;\n }\n cachedRect = target.getBoundingClientRect();\n return cachedRect;\n }\n\n function recalculate(): void {\n cachedRect = target.getBoundingClientRect();\n }\n\n type OutputSignal = ExtendSignalValue<T, OffsetValue>;\n\n const operator: OffsetOperator<T> = (source) =>\n createStream<OutputSignal>((observer) => {\n const unsub = source.subscribe({\n next(signal) {\n try {\n const rect = getRect();\n const value = signal.value as PointerValue & OffsetValue;\n\n value.offsetX = value.x - rect.left;\n value.offsetY = value.y - rect.top;\n\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n };\n });\n operator.recalculate = recalculate;\n\n return operator;\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Observer, Operator, Stream, Unsubscribe } from \"../core/stream.js\";\nimport { toObserver } from \"../core/stream.js\";\n\nexport function share<T extends Signal>(): Operator<T, T> {\n return (source): Stream<T> => {\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n observers.add(observer);\n\n if (observers.size === 1) {\n sourceUnsub = source.subscribe({\n next(value) {\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n for (const obs of observers) {\n obs.error?.(err);\n }\n },\n complete() {\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n\nexport function shareReplay<T extends Signal>(bufferSize = 1): Operator<T, T> {\n return (source): Stream<T> => {\n const buffer: T[] = [];\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let completed = false;\n let hasError = false;\n let errorValue: unknown;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n\n for (const value of buffer) {\n observer.next(value);\n }\n\n if (completed) {\n observer.complete?.();\n return () => {};\n }\n if (hasError) {\n observer.error?.(errorValue);\n return () => {};\n }\n\n observers.add(observer);\n\n if (observers.size === 1 && !sourceUnsub) {\n sourceUnsub = source.subscribe({\n next(value) {\n buffer.push(value);\n if (buffer.length > bufferSize) {\n buffer.shift();\n }\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n hasError = true;\n errorValue = err;\n for (const obs of observers) {\n obs.error?.(err);\n }\n observers.clear();\n sourceUnsub = null;\n },\n complete() {\n completed = true;\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub && !completed && !hasError) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function skip<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipped = 0;\n\n return source.subscribe({\n next(value) {\n if (skipped < count) {\n skipped++;\n } else {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n return source.subscribe({\n next(value) {\n if (skipping && !predicate(value)) {\n skipping = false;\n }\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n const notifierUnsub = notifier.subscribe(() => {\n skipping = false;\n notifierUnsub();\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n *\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * ).subscribe();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operators for ending a subscription based on count, a predicate, or a notifier.\n *\n * This is intentionally about **subscription lifecycle** (\"when should this pipeline stop?\"),\n * not about destroying the underlying event source (which may be shared by other subscribers).\n *\n * Common event/gesture patterns:\n * - One-shot trigger: `take(1)`\n * - While a condition holds: `takeWhile(predicate)`\n * - Until an explicit end signal: `takeUntil(end$)` (e.g. move until up/cancel)\n */\nexport function take<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let taken = 0;\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (taken < count) {\n taken++;\n observer.next(value);\n if (taken >= count) {\n observer.complete?.();\n unsub?.();\n }\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits only the first `count` values, then completes and unsubscribes.\n * `take(1)` is especially useful for one-shot triggers.\n */\nexport function takeWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (predicate(value)) {\n observer.next(value);\n } else {\n observer.complete?.();\n unsub?.();\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits values while `predicate(value)` is true, then completes and unsubscribes.\n */\nexport function takeUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let completed = false;\n\n const notifierUnsub = notifier.subscribe(() => {\n if (!completed) {\n completed = true;\n observer.complete?.();\n cleanup();\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!completed) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (!completed) {\n completed = true;\n observer.complete?.();\n }\n },\n });\n\n const cleanup = () => {\n notifierUnsub();\n sourceUnsub();\n };\n\n return cleanup;\n });\n}\n\n/**\n * Completes the source subscription when `notifier` emits, and unsubscribes from both.\n * This is the go-to shape for \"observe from start until end\" event flows.\n */\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.subscribe({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n"],"names":["buffer","count","source","createStream","observer","bufferArr","value","bufferTime","ms","intervalId","unsub","bufferWhen","notifier","notifierUnsub","sourceUnsub","debounce","timeoutId","distinctUntilChanged","compare","isEqual","a","b","hasLast","lastValue","distinctUntilKeyChanged","keySelector","lastKey","key","filter","predicate","err","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","offset","options","target","manual","cachedRect","getRect","recalculate","operator","signal","rect","share","observers","blocked","observerOrNext","toObserver","obs","shareReplay","bufferSize","completed","hasError","errorValue","skip","skipped","skipWhile","skipping","skipUntil","spy","fn","tap","take","taken","takeWhile","takeUntil","cleanup","throttle","lastTime","now","throttleLast","hasValue"],"mappings":"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"}
package/dist/operators.js CHANGED
@@ -1,4 +1,4 @@
1
- import { c as i, t as p } from "./stream-CDK0RZPi.js";
1
+ import { c as i, t as m } from "./stream-CDK0RZPi.js";
2
2
  function h(u) {
3
3
  return (r) => i((t) => {
4
4
  let e = [];
@@ -33,9 +33,9 @@ function k(u) {
33
33
  deviceId: "",
34
34
  createdAt: Date.now()
35
35
  }), e = []);
36
- }, u), l = r.subscribe({
37
- next(c) {
38
- e.push(c);
36
+ }, u), c = r.subscribe({
37
+ next(l) {
38
+ e.push(l);
39
39
  },
40
40
  error: t.error?.bind(t),
41
41
  complete() {
@@ -48,7 +48,7 @@ function k(u) {
48
48
  }
49
49
  });
50
50
  return () => {
51
- clearInterval(n), l();
51
+ clearInterval(n), c();
52
52
  };
53
53
  });
54
54
  }
@@ -62,9 +62,9 @@ function g(u) {
62
62
  deviceId: "",
63
63
  createdAt: Date.now()
64
64
  }), e = []);
65
- }), l = r.subscribe({
66
- next(c) {
67
- e.push(c);
65
+ }), c = r.subscribe({
66
+ next(l) {
67
+ e.push(l);
68
68
  },
69
69
  error: t.error?.bind(t),
70
70
  complete() {
@@ -77,17 +77,17 @@ function g(u) {
77
77
  }
78
78
  });
79
79
  return () => {
80
- n(), l();
80
+ n(), c();
81
81
  };
82
82
  });
83
83
  }
84
- function I(u) {
84
+ function w(u) {
85
85
  return (r) => i((t) => {
86
86
  let e = null;
87
87
  const n = r.subscribe({
88
- next(l) {
88
+ next(c) {
89
89
  e !== null && clearTimeout(e), e = setTimeout(() => {
90
- e = null, t.next(l);
90
+ e = null, t.next(c);
91
91
  }, u);
92
92
  },
93
93
  error: t.error?.bind(t),
@@ -100,34 +100,34 @@ function I(u) {
100
100
  };
101
101
  });
102
102
  }
103
- function U(u) {
103
+ function I(u) {
104
104
  const r = u ?? ((t, e) => t.value === e.value);
105
105
  return (t) => i((e) => {
106
- let n = !1, l;
106
+ let n = !1, c;
107
107
  return t.subscribe({
108
- next(c) {
109
- (!n || !r(l, c)) && (n = !0, l = c, e.next(c));
108
+ next(l) {
109
+ (!n || !r(c, l)) && (n = !0, c = l, e.next(l));
110
110
  },
111
111
  error: e.error?.bind(e),
112
112
  complete: e.complete?.bind(e)
113
113
  });
114
114
  });
115
115
  }
116
- function w(u, r) {
116
+ function U(u, r) {
117
117
  const t = r ?? ((e, n) => e === n);
118
118
  return (e) => i((n) => {
119
- let l = !1, c;
119
+ let c = !1, l;
120
120
  return e.subscribe({
121
121
  next(o) {
122
122
  const s = u(o);
123
- (!l || !t(c, s)) && (l = !0, c = s, n.next(o));
123
+ (!c || !t(l, s)) && (c = !0, l = s, n.next(o));
124
124
  },
125
125
  error: n.error?.bind(n),
126
126
  complete: n.complete?.bind(n)
127
127
  });
128
128
  });
129
129
  }
130
- function A(u) {
130
+ function y(u) {
131
131
  return (r) => i((t) => r.subscribe({
132
132
  next(e) {
133
133
  try {
@@ -140,7 +140,7 @@ function A(u) {
140
140
  complete: t.complete?.bind(t)
141
141
  }));
142
142
  }
143
- function T(u) {
143
+ function A(u) {
144
144
  return (r) => i((t) => r.subscribe({
145
145
  next(e) {
146
146
  try {
@@ -153,31 +153,31 @@ function T(u) {
153
153
  complete: t.complete?.bind(t)
154
154
  }));
155
155
  }
156
- function y(u) {
156
+ function T(u) {
157
157
  return (r) => i((t) => {
158
158
  let e = 0;
159
159
  const n = () => {
160
160
  e++, e === 2 && t.complete?.();
161
- }, l = r.subscribe({
161
+ }, c = r.subscribe({
162
162
  next: (o) => t.next(o),
163
163
  error: t.error?.bind(t),
164
164
  complete: n
165
- }), c = u.subscribe({
165
+ }), l = u.subscribe({
166
166
  next: (o) => t.next(o),
167
167
  error: t.error?.bind(t),
168
168
  complete: n
169
169
  });
170
170
  return () => {
171
- l(), c();
171
+ c(), l();
172
172
  };
173
173
  });
174
174
  }
175
- function D(...u) {
175
+ function C(...u) {
176
176
  return i((r) => {
177
177
  let t = 0;
178
178
  const e = u.map(
179
179
  (n) => n.subscribe({
180
- next: (l) => r.next(l),
180
+ next: (c) => r.next(c),
181
181
  error: r.error?.bind(r),
182
182
  complete: () => {
183
183
  t++, t === u.length && r.complete?.();
@@ -190,7 +190,39 @@ function D(...u) {
190
190
  };
191
191
  });
192
192
  }
193
- function C() {
193
+ function D(u) {
194
+ const { target: r, manual: t = !1 } = u;
195
+ if (!r)
196
+ throw new Error("offset operator requires a valid target element");
197
+ let e = null;
198
+ function n() {
199
+ return t && e || (e = r.getBoundingClientRect()), e;
200
+ }
201
+ function c() {
202
+ e = r.getBoundingClientRect();
203
+ }
204
+ const l = (o) => i((s) => {
205
+ const p = o.subscribe({
206
+ next(a) {
207
+ try {
208
+ const f = n(), d = a.value;
209
+ d.offsetX = d.x - f.left, d.offsetY = d.y - f.top, s.next(a);
210
+ } catch (f) {
211
+ s.error?.(f);
212
+ }
213
+ },
214
+ error: s.error?.bind(s),
215
+ complete() {
216
+ s.complete?.();
217
+ }
218
+ });
219
+ return () => {
220
+ p();
221
+ };
222
+ });
223
+ return l.recalculate = c, l;
224
+ }
225
+ function R() {
194
226
  return (u) => {
195
227
  const r = /* @__PURE__ */ new Set();
196
228
  let t = null, e = !1;
@@ -205,24 +237,24 @@ function C() {
205
237
  e = !1;
206
238
  },
207
239
  subscribe(n) {
208
- const l = p(n);
209
- return r.add(l), r.size === 1 && (t = u.subscribe({
210
- next(c) {
240
+ const c = m(n);
241
+ return r.add(c), r.size === 1 && (t = u.subscribe({
242
+ next(l) {
211
243
  if (!e)
212
244
  for (const o of r)
213
- o.next(c);
245
+ o.next(l);
214
246
  },
215
- error(c) {
247
+ error(l) {
216
248
  for (const o of r)
217
- o.error?.(c);
249
+ o.error?.(l);
218
250
  },
219
251
  complete() {
220
- for (const c of r)
221
- c.complete?.();
252
+ for (const l of r)
253
+ l.complete?.();
222
254
  r.clear(), t = null;
223
255
  }
224
256
  })), () => {
225
- r.delete(l), r.size === 0 && t && (t(), t = null);
257
+ r.delete(c), r.size === 0 && t && (t(), t = null);
226
258
  };
227
259
  }
228
260
  };
@@ -231,7 +263,7 @@ function C() {
231
263
  function z(u = 1) {
232
264
  return (r) => {
233
265
  const t = [], e = /* @__PURE__ */ new Set();
234
- let n = null, l = !1, c = !1, o, s = !1;
266
+ let n = null, c = !1, l = !1, o, s = !1;
235
267
  return {
236
268
  get isBlocked() {
237
269
  return s;
@@ -242,12 +274,12 @@ function z(u = 1) {
242
274
  unblock() {
243
275
  s = !1;
244
276
  },
245
- subscribe(m) {
246
- const a = p(m);
277
+ subscribe(p) {
278
+ const a = m(p);
247
279
  for (const f of t)
248
280
  a.next(f);
249
- return l ? (a.complete?.(), () => {
250
- }) : c ? (a.error?.(o), () => {
281
+ return c ? (a.complete?.(), () => {
282
+ }) : l ? (a.error?.(o), () => {
251
283
  }) : (e.add(a), e.size === 1 && !n && (n = r.subscribe({
252
284
  next(f) {
253
285
  if (t.push(f), t.length > u && t.shift(), !s)
@@ -255,25 +287,25 @@ function z(u = 1) {
255
287
  d.next(f);
256
288
  },
257
289
  error(f) {
258
- c = !0, o = f;
290
+ l = !0, o = f;
259
291
  for (const d of e)
260
292
  d.error?.(f);
261
293
  e.clear(), n = null;
262
294
  },
263
295
  complete() {
264
- l = !0;
296
+ c = !0;
265
297
  for (const f of e)
266
298
  f.complete?.();
267
299
  e.clear(), n = null;
268
300
  }
269
301
  })), () => {
270
- e.delete(a), e.size === 0 && n && !l && !c && (n(), n = null);
302
+ e.delete(a), e.size === 0 && n && !c && !l && (n(), n = null);
271
303
  });
272
304
  }
273
305
  };
274
306
  };
275
307
  }
276
- function V(u) {
308
+ function B(u) {
277
309
  return (r) => i((t) => {
278
310
  let e = 0;
279
311
  return r.subscribe({
@@ -285,7 +317,7 @@ function V(u) {
285
317
  });
286
318
  });
287
319
  }
288
- function W(u) {
320
+ function E(u) {
289
321
  return (r) => i((t) => {
290
322
  let e = !0;
291
323
  return r.subscribe({
@@ -297,24 +329,24 @@ function W(u) {
297
329
  });
298
330
  });
299
331
  }
300
- function E(u) {
332
+ function V(u) {
301
333
  return (r) => i((t) => {
302
334
  let e = !0;
303
335
  const n = u.subscribe(() => {
304
336
  e = !1, n();
305
- }), l = r.subscribe({
306
- next(c) {
307
- e || t.next(c);
337
+ }), c = r.subscribe({
338
+ next(l) {
339
+ e || t.next(l);
308
340
  },
309
341
  error: t.error?.bind(t),
310
342
  complete: t.complete?.bind(t)
311
343
  });
312
344
  return () => {
313
- n(), l();
345
+ n(), c();
314
346
  };
315
347
  });
316
348
  }
317
- function b(u) {
349
+ function x(u) {
318
350
  return (r) => i((t) => r.subscribe({
319
351
  next(e) {
320
352
  try {
@@ -327,20 +359,20 @@ function b(u) {
327
359
  complete: t.complete?.bind(t)
328
360
  }));
329
361
  }
330
- const L = b;
331
- function S(u) {
362
+ const W = x;
363
+ function q(u) {
332
364
  return (r) => i((t) => {
333
365
  let e = 0, n;
334
366
  return n = r.subscribe({
335
- next(l) {
336
- e < u && (e++, t.next(l), e >= u && (t.complete?.(), n?.()));
367
+ next(c) {
368
+ e < u && (e++, t.next(c), e >= u && (t.complete?.(), n?.()));
337
369
  },
338
370
  error: t.error?.bind(t),
339
371
  complete: t.complete?.bind(t)
340
372
  }), () => n?.();
341
373
  });
342
374
  }
343
- function q(u) {
375
+ function L(u) {
344
376
  return (r) => i((t) => {
345
377
  let e;
346
378
  return e = r.subscribe({
@@ -352,12 +384,12 @@ function q(u) {
352
384
  }), () => e?.();
353
385
  });
354
386
  }
355
- function B(u) {
387
+ function S(u) {
356
388
  return (r) => i((t) => {
357
389
  let e = !1;
358
390
  const n = u.subscribe(() => {
359
- e || (e = !0, t.complete?.(), c());
360
- }), l = r.subscribe({
391
+ e || (e = !0, t.complete?.(), l());
392
+ }), c = r.subscribe({
361
393
  next(o) {
362
394
  e || t.next(o);
363
395
  },
@@ -365,10 +397,10 @@ function B(u) {
365
397
  complete() {
366
398
  e || (e = !0, t.complete?.());
367
399
  }
368
- }), c = () => {
369
- n(), l();
400
+ }), l = () => {
401
+ n(), c();
370
402
  };
371
- return c;
403
+ return l;
372
404
  });
373
405
  }
374
406
  function K(u) {
@@ -376,8 +408,8 @@ function K(u) {
376
408
  let e = null;
377
409
  return r.subscribe({
378
410
  next(n) {
379
- const l = performance.now();
380
- (e === null || l - e >= u) && (e = l, t.next(n));
411
+ const c = performance.now();
412
+ (e === null || c - e >= u) && (e = c, t.next(n));
381
413
  },
382
414
  error: t.error?.bind(t),
383
415
  complete: t.complete?.bind(t)
@@ -386,20 +418,20 @@ function K(u) {
386
418
  }
387
419
  function O(u) {
388
420
  return (r) => i((t) => {
389
- let e, n = !1, l = null;
390
- const c = r.subscribe({
421
+ let e, n = !1, c = null;
422
+ const l = r.subscribe({
391
423
  next(o) {
392
- e = o, n = !0, l === null && (l = setTimeout(() => {
393
- n && (t.next(e), n = !1), l = null;
424
+ e = o, n = !0, c === null && (c = setTimeout(() => {
425
+ n && (t.next(e), n = !1), c = null;
394
426
  }, u));
395
427
  },
396
428
  error: t.error?.bind(t),
397
429
  complete() {
398
- l !== null && (clearTimeout(l), n && t.next(e)), t.complete?.();
430
+ c !== null && (clearTimeout(c), n && t.next(e)), t.complete?.();
399
431
  }
400
432
  });
401
433
  return () => {
402
- l !== null && clearTimeout(l), c();
434
+ c !== null && clearTimeout(c), l();
403
435
  };
404
436
  });
405
437
  }
@@ -407,23 +439,24 @@ export {
407
439
  h as buffer,
408
440
  k as bufferTime,
409
441
  g as bufferWhen,
410
- I as debounce,
411
- U as distinctUntilChanged,
412
- w as distinctUntilKeyChanged,
413
- A as filter,
414
- T as map,
415
- D as merge,
416
- y as mergeWith,
417
- C as share,
442
+ w as debounce,
443
+ I as distinctUntilChanged,
444
+ U as distinctUntilKeyChanged,
445
+ y as filter,
446
+ A as map,
447
+ C as merge,
448
+ T as mergeWith,
449
+ D as offset,
450
+ R as share,
418
451
  z as shareReplay,
419
- V as skip,
420
- E as skipUntil,
421
- W as skipWhile,
422
- b as spy,
423
- S as take,
424
- B as takeUntil,
425
- q as takeWhile,
426
- L as tap,
452
+ B as skip,
453
+ V as skipUntil,
454
+ E as skipWhile,
455
+ x as spy,
456
+ q as take,
457
+ S as takeUntil,
458
+ L as takeWhile,
459
+ W as tap,
427
460
  K as throttle,
428
461
  O as throttleLast
429
462
  };
@@ -1 +1 @@
1
- {"version":3,"file":"operators.js","sources":["../src/operators/buffer.ts","../src/operators/debounce.ts","../src/operators/distinct.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/share.ts","../src/operators/skip.ts","../src/operators/spy.ts","../src/operators/take.ts","../src/operators/throttle.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function buffer<T extends Signal>(count: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n return source.subscribe({\n next(value) {\n bufferArr.push(value);\n if (bufferArr.length >= count) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n });\n}\n\nexport function bufferTime<T extends Signal>(ms: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const intervalId = setInterval(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n }, ms);\n\n const unsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n clearInterval(intervalId);\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n clearInterval(intervalId);\n unsub();\n };\n });\n}\n\nexport function bufferWhen<T extends Signal>(\n notifier: Stream<Signal>,\n): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const notifierUnsub = notifier.subscribe(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n notifierUnsub();\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Emits values only when they differ from the previous emitted value.\n *\n * In event/gesture pipelines, this is useful when you only want to react to\n * meaningful changes (e.g. pointer coordinates changed, delta changed, a state transition happened).\n *\n * The default comparison is based on Signal's value property using `===`.\n * For objects/arrays, provide `compare` to avoid treating freshly-created but equivalent values as \"changed\".\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n * import { map } from \"./map.js\";\n *\n * // Only emit when the pointer position actually changes\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * map((e) => ({ x: e.clientX, y: e.clientY })),\n * distinctUntilChanged((a, b) => a.value.x === b.value.x && a.value.y === b.value.y),\n * ).subscribe(({ x, y }) => {\n * // Called only when (x, y) changes\n * });\n * ```\n */\nexport function distinctUntilChanged<T extends Signal>(\n compare?: (prev: T, curr: T) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: T, b: T) => a.value === b.value);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastValue: T;\n\n return source.subscribe({\n next(value) {\n if (!hasLast || !isEqual(lastValue, value)) {\n hasLast = true;\n lastValue = value;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/**\n * Like `distinctUntilChanged`, but compares a derived key instead of the entire value.\n *\n * This is convenient for gesture events when reacting to state transitions,\n * such as changes in `phase`.\n *\n * @example\n * ```typescript\n * import { pipe } from \"../pipe.js\";\n *\n * // Emit only when the gesture phase changes (start/change/end/cancel)\n * pipe(\n * pan(element),\n * distinctUntilKeyChanged((e) => e.value.phase),\n * ).subscribe((e) => {\n * // Consecutive identical phases are skipped; only transitions arrive here\n * });\n * ```\n */\nexport function distinctUntilKeyChanged<T extends Signal, K>(\n keySelector: (value: T) => K,\n compare?: (prev: K, curr: K) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: K, b: K) => a === b);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastKey: K;\n\n return source.subscribe({\n next(value) {\n const key = keySelector(value);\n if (!hasLast || !isEqual(lastKey, key)) {\n hasLast = true;\n lastKey = key;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Observer, Operator, Stream, Unsubscribe } from \"../core/stream.js\";\nimport { toObserver } from \"../core/stream.js\";\n\nexport function share<T extends Signal>(): Operator<T, T> {\n return (source): Stream<T> => {\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n observers.add(observer);\n\n if (observers.size === 1) {\n sourceUnsub = source.subscribe({\n next(value) {\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n for (const obs of observers) {\n obs.error?.(err);\n }\n },\n complete() {\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n\nexport function shareReplay<T extends Signal>(bufferSize = 1): Operator<T, T> {\n return (source): Stream<T> => {\n const buffer: T[] = [];\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let completed = false;\n let hasError = false;\n let errorValue: unknown;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n\n for (const value of buffer) {\n observer.next(value);\n }\n\n if (completed) {\n observer.complete?.();\n return () => {};\n }\n if (hasError) {\n observer.error?.(errorValue);\n return () => {};\n }\n\n observers.add(observer);\n\n if (observers.size === 1 && !sourceUnsub) {\n sourceUnsub = source.subscribe({\n next(value) {\n buffer.push(value);\n if (buffer.length > bufferSize) {\n buffer.shift();\n }\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n hasError = true;\n errorValue = err;\n for (const obs of observers) {\n obs.error?.(err);\n }\n observers.clear();\n sourceUnsub = null;\n },\n complete() {\n completed = true;\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub && !completed && !hasError) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function skip<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipped = 0;\n\n return source.subscribe({\n next(value) {\n if (skipped < count) {\n skipped++;\n } else {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n return source.subscribe({\n next(value) {\n if (skipping && !predicate(value)) {\n skipping = false;\n }\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n const notifierUnsub = notifier.subscribe(() => {\n skipping = false;\n notifierUnsub();\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n *\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * ).subscribe();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operators for ending a subscription based on count, a predicate, or a notifier.\n *\n * This is intentionally about **subscription lifecycle** (\"when should this pipeline stop?\"),\n * not about destroying the underlying event source (which may be shared by other subscribers).\n *\n * Common event/gesture patterns:\n * - One-shot trigger: `take(1)`\n * - While a condition holds: `takeWhile(predicate)`\n * - Until an explicit end signal: `takeUntil(end$)` (e.g. move until up/cancel)\n */\nexport function take<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let taken = 0;\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (taken < count) {\n taken++;\n observer.next(value);\n if (taken >= count) {\n observer.complete?.();\n unsub?.();\n }\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits only the first `count` values, then completes and unsubscribes.\n * `take(1)` is especially useful for one-shot triggers.\n */\nexport function takeWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (predicate(value)) {\n observer.next(value);\n } else {\n observer.complete?.();\n unsub?.();\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits values while `predicate(value)` is true, then completes and unsubscribes.\n */\nexport function takeUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let completed = false;\n\n const notifierUnsub = notifier.subscribe(() => {\n if (!completed) {\n completed = true;\n observer.complete?.();\n cleanup();\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!completed) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (!completed) {\n completed = true;\n observer.complete?.();\n }\n },\n });\n\n const cleanup = () => {\n notifierUnsub();\n sourceUnsub();\n };\n\n return cleanup;\n });\n}\n\n/**\n * Completes the source subscription when `notifier` emits, and unsubscribes from both.\n * This is the go-to shape for \"observe from start until end\" event flows.\n */\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.subscribe({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n"],"names":["buffer","count","source","createStream","observer","bufferArr","value","bufferTime","ms","intervalId","unsub","bufferWhen","notifier","notifierUnsub","sourceUnsub","debounce","timeoutId","distinctUntilChanged","compare","isEqual","a","b","hasLast","lastValue","distinctUntilKeyChanged","keySelector","lastKey","key","filter","predicate","err","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","share","observers","blocked","observerOrNext","toObserver","obs","shareReplay","bufferSize","completed","hasError","errorValue","skip","skipped","skipWhile","skipping","skipUntil","spy","fn","tap","take","taken","takeWhile","takeUntil","cleanup","throttle","lastTime","now","throttleLast","hasValue"],"mappings":"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"}
1
+ {"version":3,"file":"operators.js","sources":["../src/operators/buffer.ts","../src/operators/debounce.ts","../src/operators/distinct.ts","../src/operators/filter.ts","../src/operators/map.ts","../src/operators/merge.ts","../src/operators/offset.ts","../src/operators/share.ts","../src/operators/skip.ts","../src/operators/spy.ts","../src/operators/take.ts","../src/operators/throttle.ts"],"sourcesContent":["import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function buffer<T extends Signal>(count: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n return source.subscribe({\n next(value) {\n bufferArr.push(value);\n if (bufferArr.length >= count) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n });\n}\n\nexport function bufferTime<T extends Signal>(ms: number): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const intervalId = setInterval(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n }, ms);\n\n const unsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n clearInterval(intervalId);\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n clearInterval(intervalId);\n unsub();\n };\n });\n}\n\nexport function bufferWhen<T extends Signal>(\n notifier: Stream<Signal>,\n): Operator<T, Signal<\"buffer\", T[]>> {\n return (source) =>\n createStream((observer) => {\n let bufferArr: T[] = [];\n\n const notifierUnsub = notifier.subscribe(() => {\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n bufferArr = [];\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n bufferArr.push(value);\n },\n error: observer.error?.bind(observer),\n complete() {\n notifierUnsub();\n if (bufferArr.length > 0) {\n observer.next({\n kind: \"buffer\",\n value: bufferArr,\n deviceId: \"\",\n createdAt: Date.now(),\n });\n }\n observer.complete?.();\n },\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function debounce<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = null;\n observer.next(value);\n }, ms);\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Emits values only when they differ from the previous emitted value.\n *\n * In event/gesture pipelines, this is useful when you only want to react to\n * meaningful changes (e.g. pointer coordinates changed, delta changed, a state transition happened).\n *\n * The default comparison is based on Signal's value property using `===`.\n * For objects/arrays, provide `compare` to avoid treating freshly-created but equivalent values as \"changed\".\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n * import { map } from \"./map.js\";\n *\n * // Only emit when the pointer position actually changes\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * map((e) => ({ x: e.clientX, y: e.clientY })),\n * distinctUntilChanged((a, b) => a.value.x === b.value.x && a.value.y === b.value.y),\n * ).subscribe(({ x, y }) => {\n * // Called only when (x, y) changes\n * });\n * ```\n */\nexport function distinctUntilChanged<T extends Signal>(\n compare?: (prev: T, curr: T) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: T, b: T) => a.value === b.value);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastValue: T;\n\n return source.subscribe({\n next(value) {\n if (!hasLast || !isEqual(lastValue, value)) {\n hasLast = true;\n lastValue = value;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/**\n * Like `distinctUntilChanged`, but compares a derived key instead of the entire value.\n *\n * This is convenient for gesture events when reacting to state transitions,\n * such as changes in `phase`.\n *\n * @example\n * ```typescript\n * import { pipe } from \"../pipe.js\";\n *\n * // Emit only when the gesture phase changes (start/change/end/cancel)\n * pipe(\n * pan(element),\n * distinctUntilKeyChanged((e) => e.value.phase),\n * ).subscribe((e) => {\n * // Consecutive identical phases are skipped; only transitions arrive here\n * });\n * ```\n */\nexport function distinctUntilKeyChanged<T extends Signal, K>(\n keySelector: (value: T) => K,\n compare?: (prev: K, curr: K) => boolean,\n): Operator<T, T> {\n const isEqual = compare ?? ((a: K, b: K) => a === b);\n\n return (source) =>\n createStream((observer) => {\n let hasLast = false;\n let lastKey: K;\n\n return source.subscribe({\n next(value) {\n const key = keySelector(value);\n if (!hasLast || !isEqual(lastKey, key)) {\n hasLast = true;\n lastKey = key;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function filter<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n if (predicate(value)) {\n observer.next(value);\n }\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function map<T extends Signal, R extends Signal>(\n transform: (value: T) => R,\n): Operator<T, R> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n observer.next(transform(value));\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function mergeWith<T extends Signal, R extends Signal>(\n other: Stream<R>,\n): Operator<T, T | R> {\n return (source) =>\n createStream((observer) => {\n let completedCount = 0;\n\n const checkComplete = () => {\n completedCount++;\n if (completedCount === 2) {\n observer.complete?.();\n }\n };\n\n const unsub1 = source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n const unsub2 = other.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: checkComplete,\n });\n\n return () => {\n unsub1();\n unsub2();\n };\n });\n}\n\nexport function merge<T extends Signal>(...sources: Stream<T>[]): Stream<T> {\n return createStream((observer) => {\n let completedCount = 0;\n\n const unsubs = sources.map((source) =>\n source.subscribe({\n next: (value) => observer.next(value),\n error: observer.error?.bind(observer),\n complete: () => {\n completedCount++;\n if (completedCount === sources.length) {\n observer.complete?.();\n }\n },\n }),\n );\n\n return () => {\n for (const unsub of unsubs) {\n unsub();\n }\n };\n });\n}\n","import type { ExtendSignalValue, SignalWith } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface OffsetOptions {\n target: Element;\n manual?: boolean;\n}\n\nexport interface PointerValue {\n x: number;\n y: number;\n}\n\nexport interface OffsetValue {\n offsetX: number;\n offsetY: number;\n}\n\nexport type OffsetOperatorResult<T extends SignalWith<PointerValue>> = ExtendSignalValue<\n T,\n OffsetValue\n>;\n\nexport interface OffsetOperator<T extends SignalWith<PointerValue>>\n extends Operator<T, ExtendSignalValue<T, OffsetValue>> {\n recalculate(): void;\n}\n\n/**\n * Creates an operator that adds element-relative offset coordinates to pointer signals.\n * Uses getBoundingClientRect() to calculate offsetX and offsetY relative to the target element.\n */\nexport function offset<T extends SignalWith<PointerValue>>(\n options: OffsetOptions,\n): OffsetOperator<T> {\n const { target, manual = false } = options;\n if (!target) {\n throw new Error(\"offset operator requires a valid target element\");\n }\n\n let cachedRect: DOMRect | null = null;\n\n function getRect(): DOMRect {\n if (manual && cachedRect) {\n return cachedRect;\n }\n cachedRect = target.getBoundingClientRect();\n return cachedRect;\n }\n\n function recalculate(): void {\n cachedRect = target.getBoundingClientRect();\n }\n\n type OutputSignal = ExtendSignalValue<T, OffsetValue>;\n\n const operator: OffsetOperator<T> = (source) =>\n createStream<OutputSignal>((observer) => {\n const unsub = source.subscribe({\n next(signal) {\n try {\n const rect = getRect();\n const value = signal.value as PointerValue & OffsetValue;\n\n value.offsetX = value.x - rect.left;\n value.offsetY = value.y - rect.top;\n\n observer.next(signal as unknown as OutputSignal);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n };\n });\n operator.recalculate = recalculate;\n\n return operator;\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Observer, Operator, Stream, Unsubscribe } from \"../core/stream.js\";\nimport { toObserver } from \"../core/stream.js\";\n\nexport function share<T extends Signal>(): Operator<T, T> {\n return (source): Stream<T> => {\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n observers.add(observer);\n\n if (observers.size === 1) {\n sourceUnsub = source.subscribe({\n next(value) {\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n for (const obs of observers) {\n obs.error?.(err);\n }\n },\n complete() {\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n\nexport function shareReplay<T extends Signal>(bufferSize = 1): Operator<T, T> {\n return (source): Stream<T> => {\n const buffer: T[] = [];\n const observers = new Set<Observer<T>>();\n let sourceUnsub: Unsubscribe | null = null;\n let completed = false;\n let hasError = false;\n let errorValue: unknown;\n let blocked = false;\n\n return {\n get isBlocked() {\n return blocked;\n },\n\n block() {\n blocked = true;\n },\n\n unblock() {\n blocked = false;\n },\n\n subscribe(observerOrNext) {\n const observer = toObserver(observerOrNext);\n\n for (const value of buffer) {\n observer.next(value);\n }\n\n if (completed) {\n observer.complete?.();\n return () => {};\n }\n if (hasError) {\n observer.error?.(errorValue);\n return () => {};\n }\n\n observers.add(observer);\n\n if (observers.size === 1 && !sourceUnsub) {\n sourceUnsub = source.subscribe({\n next(value) {\n buffer.push(value);\n if (buffer.length > bufferSize) {\n buffer.shift();\n }\n if (blocked) return;\n for (const obs of observers) {\n obs.next(value);\n }\n },\n error(err) {\n hasError = true;\n errorValue = err;\n for (const obs of observers) {\n obs.error?.(err);\n }\n observers.clear();\n sourceUnsub = null;\n },\n complete() {\n completed = true;\n for (const obs of observers) {\n obs.complete?.();\n }\n observers.clear();\n sourceUnsub = null;\n },\n });\n }\n\n return () => {\n observers.delete(observer);\n if (observers.size === 0 && sourceUnsub && !completed && !hasError) {\n sourceUnsub();\n sourceUnsub = null;\n }\n };\n },\n };\n };\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function skip<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipped = 0;\n\n return source.subscribe({\n next(value) {\n if (skipped < count) {\n skipped++;\n } else {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n return source.subscribe({\n next(value) {\n if (skipping && !predicate(value)) {\n skipping = false;\n }\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function skipUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let skipping = true;\n\n const notifierUnsub = notifier.subscribe(() => {\n skipping = false;\n notifierUnsub();\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!skipping) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operator that passes values through unchanged while running a side-effect.\n *\n * In event/gesture pipelines, this is commonly used for:\n * - Debug logging (coordinates, phases, state transitions)\n * - Tracing/metrics (timing, counters)\n * - Applying flags on events (e.g. calling `event.prevent()`), then filtering later (e.g. with `excludePrevented()`)\n *\n * If `fn` throws, the error is forwarded to the downstream `error` handler.\n *\n * @example\n * ```typescript\n * import { eventSource } from \"../../source/event-source-factory.js\";\n * import { pipe } from \"../pipe.js\";\n *\n * pipe(\n * eventSource<PointerEvent>(element, \"pointermove\"),\n * spy((e) => {\n * // Observe without modifying the stream values\n * console.log(e.clientX, e.clientY);\n * }),\n * ).subscribe();\n * ```\n */\nexport function spy<T extends Signal>(fn: (value: T) => void): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n return source.subscribe({\n next(value) {\n try {\n fn(value);\n observer.next(value);\n } catch (err) {\n observer.error?.(err);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\n/** Alias for spy - RxJS-compatible naming */\nexport const tap = spy;\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\n/**\n * Operators for ending a subscription based on count, a predicate, or a notifier.\n *\n * This is intentionally about **subscription lifecycle** (\"when should this pipeline stop?\"),\n * not about destroying the underlying event source (which may be shared by other subscribers).\n *\n * Common event/gesture patterns:\n * - One-shot trigger: `take(1)`\n * - While a condition holds: `takeWhile(predicate)`\n * - Until an explicit end signal: `takeUntil(end$)` (e.g. move until up/cancel)\n */\nexport function take<T extends Signal>(count: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let taken = 0;\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (taken < count) {\n taken++;\n observer.next(value);\n if (taken >= count) {\n observer.complete?.();\n unsub?.();\n }\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits only the first `count` values, then completes and unsubscribes.\n * `take(1)` is especially useful for one-shot triggers.\n */\nexport function takeWhile<T extends Signal>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let unsub: (() => void) | undefined;\n\n unsub = source.subscribe({\n next(value) {\n if (predicate(value)) {\n observer.next(value);\n } else {\n observer.complete?.();\n unsub?.();\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n\n return () => unsub?.();\n });\n}\n\n/**\n * Emits values while `predicate(value)` is true, then completes and unsubscribes.\n */\nexport function takeUntil<T extends Signal>(notifier: Stream<Signal>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let completed = false;\n\n const notifierUnsub = notifier.subscribe(() => {\n if (!completed) {\n completed = true;\n observer.complete?.();\n cleanup();\n }\n });\n\n const sourceUnsub = source.subscribe({\n next(value) {\n if (!completed) {\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (!completed) {\n completed = true;\n observer.complete?.();\n }\n },\n });\n\n const cleanup = () => {\n notifierUnsub();\n sourceUnsub();\n };\n\n return cleanup;\n });\n}\n\n/**\n * Completes the source subscription when `notifier` emits, and unsubscribes from both.\n * This is the go-to shape for \"observe from start until end\" event flows.\n */\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport function throttle<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastTime: number | null = null;\n\n return source.subscribe({\n next(value) {\n const now = performance.now();\n if (lastTime === null || now - lastTime >= ms) {\n lastTime = now;\n observer.next(value);\n }\n },\n error: observer.error?.bind(observer),\n complete: observer.complete?.bind(observer),\n });\n });\n}\n\nexport function throttleLast<T extends Signal>(ms: number): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let lastValue: T | undefined;\n let hasValue = false;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n const unsub = source.subscribe({\n next(value) {\n lastValue = value;\n hasValue = true;\n\n if (timeoutId === null) {\n timeoutId = setTimeout(() => {\n if (hasValue) {\n observer.next(lastValue!);\n hasValue = false;\n }\n timeoutId = null;\n }, ms);\n }\n },\n error: observer.error?.bind(observer),\n complete() {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n if (hasValue) {\n observer.next(lastValue!);\n }\n }\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n }\n unsub();\n };\n });\n}\n"],"names":["buffer","count","source","createStream","observer","bufferArr","value","bufferTime","ms","intervalId","unsub","bufferWhen","notifier","notifierUnsub","sourceUnsub","debounce","timeoutId","distinctUntilChanged","compare","isEqual","a","b","hasLast","lastValue","distinctUntilKeyChanged","keySelector","lastKey","key","filter","predicate","err","map","transform","mergeWith","other","completedCount","checkComplete","unsub1","unsub2","merge","sources","unsubs","offset","options","target","manual","cachedRect","getRect","recalculate","operator","signal","rect","share","observers","blocked","observerOrNext","toObserver","obs","shareReplay","bufferSize","completed","hasError","errorValue","skip","skipped","skipWhile","skipping","skipUntil","spy","fn","tap","take","taken","takeWhile","takeUntil","cleanup","throttle","lastTime","now","throttleLast","hasValue"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cereb",
3
3
  "description": "User input modeling and orchestration with a lightweight reactive stream library.",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "license": "MIT",
6
6
  "author": "devphilip21 <philip21.dev@gmail.com>",
7
7
  "repository": {