cereb 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -2
- package/dist/browser/single-pointer/pointer.d.ts +1 -1
- package/dist/browser/single-pointer/pointer.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-mouse.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-pointer.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer-from-touch.d.ts.map +1 -1
- package/dist/browser/single-pointer/recognizer.d.ts +1 -1
- package/dist/browser/single-pointer/recognizer.d.ts.map +1 -1
- package/dist/browser/single-pointer/single-pointer-signal.d.ts +0 -1
- package/dist/browser/single-pointer/single-pointer-signal.d.ts.map +1 -1
- package/dist/browser/single-pointer/types.d.ts +1 -3
- package/dist/browser/single-pointer/types.d.ts.map +1 -1
- package/dist/core/signal.d.ts +5 -5
- package/dist/core/signal.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +73 -111
- package/dist/index.js.map +1 -1
- package/dist/internal/types.d.ts +14 -0
- package/dist/internal/types.d.ts.map +1 -0
- package/dist/operators/offset.d.ts +21 -7
- package/dist/operators/offset.d.ts.map +1 -1
- package/dist/operators.cjs +1 -1
- package/dist/operators.cjs.map +1 -1
- package/dist/operators.js +49 -47
- package/dist/operators.js.map +1 -1
- package/dist/recognizer-CGZKcxpa.js +56 -0
- package/dist/recognizer-CGZKcxpa.js.map +1 -0
- package/dist/recognizer-DbiEtBOM.cjs +2 -0
- package/dist/recognizer-DbiEtBOM.cjs.map +1 -0
- package/dist/single-pointer/mouse.cjs +1 -1
- package/dist/single-pointer/mouse.cjs.map +1 -1
- package/dist/single-pointer/mouse.js +25 -24
- package/dist/single-pointer/mouse.js.map +1 -1
- package/dist/single-pointer/pointer.cjs +1 -1
- package/dist/single-pointer/pointer.cjs.map +1 -1
- package/dist/single-pointer/pointer.js +62 -1
- package/dist/single-pointer/pointer.js.map +1 -1
- package/dist/single-pointer/touch.cjs +1 -1
- package/dist/single-pointer/touch.cjs.map +1 -1
- package/dist/single-pointer/touch.js +26 -25
- package/dist/single-pointer/touch.js.map +1 -1
- package/dist/types-BGR5Mhw9.cjs.map +1 -1
- package/dist/types-Ccnqx90M.js.map +1 -1
- package/package.json +4 -11
- package/dist/browser/single-pointer/pool.d.ts +0 -4
- package/dist/browser/single-pointer/pool.d.ts.map +0 -1
- package/dist/recognizer-BrqdN-1T.cjs +0 -2
- package/dist/recognizer-BrqdN-1T.cjs.map +0 -1
- package/dist/recognizer-FFAuyJ19.js +0 -101
- package/dist/recognizer-FFAuyJ19.js.map +0 -1
package/dist/operators.js.map
CHANGED
|
@@ -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/offset.ts","../src/operators/session.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 { SinglePointerSignal } from \"../browser/single-pointer/single-pointer-signal.js\";\nimport type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface SessionOptions<T extends Signal> {\n start: (signal: T) => boolean;\n end: (signal: T) => boolean;\n}\n\n/**\n * Filters signals to only emit during active sessions.\n * A session begins when the start predicate returns true and ends when the end predicate returns true.\n * Both start and end signals are included in the output.\n * Sessions can repeat: after an end, the next start begins a new session.\n */\nexport function session<T extends Signal>(options: SessionOptions<T>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n\n return source.subscribe({\n next(value) {\n try {\n if (!active) {\n if (options.start(value)) {\n active = true;\n observer.next(value);\n }\n } else {\n observer.next(value);\n if (options.end(value)) {\n active = false;\n }\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\nexport function singlePointerSession(): Operator<SinglePointerSignal, SinglePointerSignal> {\n return session({\n start: (signal) => signal.value.phase === \"start\",\n end: (signal) => signal.value.phase === \"end\" || signal.value.phase === \"cancel\",\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","offset","options","target","manual","cachedRect","getRect","recalculate","operator","signal","rect","session","active","singlePointerSession","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/session.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, Signal, SignalWith } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface OffsetOptions {\n target: Element;\n /**\n * Optional stream that triggers rect recalculation.\n * When provided, the operator caches the rect and only recalculates when this stream emits.\n * When not provided, getBoundingClientRect() is called on every signal (always accurate).\n *\n * @example\n * // Cache rect, recalculate on window resize\n * const resize$ = domEvent(window, 'resize');\n * offset({ target: el, recalculate$: resize$ })\n *\n * @example\n * // Always calculate (no caching, always accurate)\n * offset({ target: el })\n */\n recalculate$?: Stream<Signal>;\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\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 *\n * @param options.target - The element to calculate offset relative to\n * @param options.recalculate$ - Optional stream that triggers rect recalculation for caching\n */\nexport function offset<T extends SignalWith<PointerValue>>(\n options: OffsetOptions,\n): Operator<T, ExtendSignalValue<T, OffsetValue>> {\n const { target, recalculate$ } = options;\n if (!target) {\n throw new Error(\"offset operator requires a valid target element\");\n }\n\n type OutputSignal = ExtendSignalValue<T, OffsetValue>;\n\n return (source) =>\n createStream<OutputSignal>((observer) => {\n let cachedRect: DOMRect | null = null;\n\n function getRect(): DOMRect {\n // If recalculate$ is provided, use caching\n if (recalculate$) {\n if (!cachedRect) {\n cachedRect = target.getBoundingClientRect();\n }\n return cachedRect;\n }\n // No recalculate$ means always calculate fresh\n return target.getBoundingClientRect();\n }\n\n // Subscribe to recalculate$ if provided\n let recalculateUnsub: (() => void) | undefined;\n if (recalculate$) {\n recalculateUnsub = recalculate$.subscribe({\n next() {\n cachedRect = target.getBoundingClientRect();\n },\n });\n }\n\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 recalculateUnsub?.();\n };\n });\n}\n","import type { SinglePointerSignal } from \"../browser/single-pointer/single-pointer-signal.js\";\nimport type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { createStream } from \"../core/stream.js\";\n\nexport interface SessionOptions<T extends Signal> {\n start: (signal: T) => boolean;\n end: (signal: T) => boolean;\n}\n\n/**\n * Filters signals to only emit during active sessions.\n * A session begins when the start predicate returns true and ends when the end predicate returns true.\n * Both start and end signals are included in the output.\n * Sessions can repeat: after an end, the next start begins a new session.\n */\nexport function session<T extends Signal>(options: SessionOptions<T>): Operator<T, T> {\n return (source) =>\n createStream((observer) => {\n let active = false;\n\n return source.subscribe({\n next(value) {\n try {\n if (!active) {\n if (options.start(value)) {\n active = true;\n observer.next(value);\n }\n } else {\n observer.next(value);\n if (options.end(value)) {\n active = false;\n }\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\nexport function singlePointerSession(): Operator<SinglePointerSignal, SinglePointerSignal> {\n return session({\n start: (signal) => signal.value.phase === \"start\",\n end: (signal) => signal.value.phase === \"end\" || signal.value.phase === \"cancel\",\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","offset","options","target","recalculate$","cachedRect","getRect","recalculateUnsub","signal","rect","session","active","singlePointerSession","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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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
let i = "";
|
|
2
|
+
function c() {
|
|
3
|
+
return i;
|
|
4
|
+
}
|
|
5
|
+
function g(e) {
|
|
6
|
+
i = e;
|
|
7
|
+
}
|
|
8
|
+
function s(e, r) {
|
|
9
|
+
return {
|
|
10
|
+
kind: e,
|
|
11
|
+
value: r,
|
|
12
|
+
deviceId: c(),
|
|
13
|
+
createdAt: performance.now()
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const u = "single-pointer";
|
|
17
|
+
function a(e) {
|
|
18
|
+
return s(u, e);
|
|
19
|
+
}
|
|
20
|
+
function l() {
|
|
21
|
+
return a({
|
|
22
|
+
id: "",
|
|
23
|
+
phase: "move",
|
|
24
|
+
x: 0,
|
|
25
|
+
y: 0,
|
|
26
|
+
pageX: 0,
|
|
27
|
+
pageY: 0,
|
|
28
|
+
pointerType: "unknown",
|
|
29
|
+
button: "none",
|
|
30
|
+
pressure: 0.5
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
function p(e, r = {}) {
|
|
34
|
+
let n = null;
|
|
35
|
+
return {
|
|
36
|
+
process: (o) => {
|
|
37
|
+
const t = l();
|
|
38
|
+
return e(o, t), n = t, t;
|
|
39
|
+
},
|
|
40
|
+
get isActive() {
|
|
41
|
+
return n !== null;
|
|
42
|
+
},
|
|
43
|
+
reset() {
|
|
44
|
+
n = null;
|
|
45
|
+
},
|
|
46
|
+
dispose() {
|
|
47
|
+
this.reset();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
s as a,
|
|
53
|
+
p as c,
|
|
54
|
+
g as s
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=recognizer-CGZKcxpa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognizer-CGZKcxpa.js","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.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 readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly 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","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","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n processor(inputSignal, signal);\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","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;AC9BO,MAAMM,IAA6B;AAmBnC,SAASC,EAA0BC,GAA6C;AACrF,SAAOL,EAAaG,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;AC1BO,SAASG,EACdC,GACAC,IAAiC,IACK;AACtC,MAAIC,IAAsC;AAE1C,SAAO;AAAA,IACL,SAAS,CAACC,MAAgB;AACxB,YAAMC,IAASN,EAAA;AACf,aAAAE,EAAUG,GAAaC,CAAM,GAC7BF,IAAUE,GACHA;AAAA,IACT;AAAA,IACA,IAAI,WAAoB;AACtB,aAAOF,MAAY;AAAA,IACrB;AAAA,IACA,QAAc;AACZ,MAAAA,IAAU;AAAA,IACZ;AAAA,IACA,UAAgB;AACd,WAAK,MAAA;AAAA,IACP;AAAA,EAAA;AAEJ;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";let i="";function u(){return i}function s(e){i=e}function c(e,r){return{kind:e,value:r,deviceId:u(),createdAt:performance.now()}}const l="single-pointer";function a(e){return c(l,e)}function g(){return a({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"unknown",button:"none",pressure:.5})}function p(e,r={}){let n=null;return{process:o=>{const t=g();return e(o,t),n=t,t},get isActive(){return n!==null},reset(){n=null},dispose(){this.reset()}}}exports.createSignal=c;exports.createSinglePointerRecognizer=p;exports.setCerebDeviceId=s;
|
|
2
|
+
//# sourceMappingURL=recognizer-DbiEtBOM.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognizer-DbiEtBOM.cjs","sources":["../src/core/meta.ts","../src/core/signal.ts","../src/browser/single-pointer/single-pointer-signal.ts","../src/browser/single-pointer/recognizer.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 readonly kind: K;\n readonly value: V;\n readonly deviceId: string;\n readonly createdAt: number;\n readonly 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","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","import type { Signal } from \"../../core/signal.js\";\nimport {\n createDefaultSinglePointerSignal,\n type SinglePointerSignal,\n} from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions } from \"./types.js\";\n\nexport interface SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n _options: SinglePointerOptions = {},\n): SinglePointerRecognizer<InputSignal> {\n let current: SinglePointerSignal | null = null;\n\n return {\n process: (inputSignal) => {\n const signal = createDefaultSinglePointerSignal();\n processor(inputSignal, signal);\n current = signal;\n return signal;\n },\n get isActive(): boolean {\n return current !== null;\n },\n reset(): void {\n current = null;\n },\n dispose(): void {\n this.reset();\n },\n };\n}\n"],"names":["deviceId","getCerebDeviceId","setCerebDeviceId","id","createSignal","kind","value","SINGLE_POINTER_SIGNAL_KIND","createSinglePointerSignal","pointer","createDefaultSinglePointerSignal","createSinglePointerRecognizer","processor","_options","current","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,CC9BO,MAAMM,EAA6B,iBAmBnC,SAASC,EAA0BC,EAA6C,CACrF,OAAOL,EAAaG,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,CC1BO,SAASG,EACdC,EACAC,EAAiC,GACK,CACtC,IAAIC,EAAsC,KAE1C,MAAO,CACL,QAAUC,GAAgB,CACxB,MAAMC,EAASN,EAAA,EACf,OAAAE,EAAUG,EAAaC,CAAM,EAC7BF,EAAUE,EACHA,CACT,EACA,IAAI,UAAoB,CACtB,OAAOF,IAAY,IACrB,EACA,OAAc,CACZA,EAAU,IACZ,EACA,SAAgB,CACd,KAAK,MAAA,CACP,CAAA,CAEJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-Cp6eCZs2.cjs"),g=require("../recognizer-DbiEtBOM.cjs"),u=require("../types-BGR5Mhw9.cjs");function a(c={}){function i(r,s){const e=r.value;let t,o;switch(e.type){case"mousedown":t="start",o=u.toSinglePointerButton(e.button);break;case"mouseup":t="end",o=u.toSinglePointerButton(e.button);break;default:t="move",o="none"}const n=s.value;n.id="",n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType="mouse",n.button=o,n.pressure=t==="move"&&e.buttons===0?0:.5}return g.createSinglePointerRecognizer(i,c)}function l(c={}){return i=>p.createStream(r=>{const s=a(c),e=i.subscribe({next(t){const o=s.process(t);r.next(o)},error(t){r.error?.(t)},complete(){r.complete?.()}});return()=>{e(),s.dispose()}})}exports.createMouseRecognizer=a;exports.singlePointerRecognizer=l;
|
|
2
2
|
//# sourceMappingURL=mouse.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse.cjs","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n signal.value.id = \"\";\n
|
|
1
|
+
{"version":3,"file":"mouse.cjs","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = recognizer.process(event);\n observer.next(pointer);\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":"qMAaO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EACPC,EACAC,EACM,CACN,MAAM,EAAID,EAAe,MACzB,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,YACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,UACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,QACEF,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjBI,EAAE,GAAK,GACPA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAc,QAChBA,EAAE,OAASF,EACXE,EAAE,SAAWH,IAAU,QAAU,EAAE,UAAY,EAAI,EAAI,EACzD,CAEA,OAAOI,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,UAAU,CAC7B,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACxCH,EAAS,KAAKI,CAAO,CACvB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
|
|
@@ -1,45 +1,46 @@
|
|
|
1
1
|
import { c as a } from "../stream-CDK0RZPi.js";
|
|
2
|
-
import { c as p } from "../recognizer-
|
|
3
|
-
import { t as
|
|
4
|
-
function
|
|
5
|
-
function
|
|
6
|
-
const
|
|
7
|
-
let
|
|
8
|
-
switch (
|
|
2
|
+
import { c as p } from "../recognizer-CGZKcxpa.js";
|
|
3
|
+
import { t as u } from "../types-Ccnqx90M.js";
|
|
4
|
+
function m(c = {}) {
|
|
5
|
+
function i(r, s) {
|
|
6
|
+
const e = r.value;
|
|
7
|
+
let t, n;
|
|
8
|
+
switch (e.type) {
|
|
9
9
|
case "mousedown":
|
|
10
|
-
|
|
10
|
+
t = "start", n = u(e.button);
|
|
11
11
|
break;
|
|
12
12
|
case "mouseup":
|
|
13
|
-
|
|
13
|
+
t = "end", n = u(e.button);
|
|
14
14
|
break;
|
|
15
15
|
default:
|
|
16
|
-
|
|
16
|
+
t = "move", n = "none";
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
const o = s.value;
|
|
19
|
+
o.id = "", o.phase = t, o.x = e.clientX, o.y = e.clientY, o.pageX = e.pageX, o.pageY = e.pageY, o.pointerType = "mouse", o.button = n, o.pressure = t === "move" && e.buttons === 0 ? 0 : 0.5;
|
|
19
20
|
}
|
|
20
|
-
return p(
|
|
21
|
+
return p(i, c);
|
|
21
22
|
}
|
|
22
|
-
function
|
|
23
|
-
return (
|
|
24
|
-
const
|
|
25
|
-
next(
|
|
26
|
-
const
|
|
27
|
-
|
|
23
|
+
function f(c = {}) {
|
|
24
|
+
return (i) => a((r) => {
|
|
25
|
+
const s = m(c), e = i.subscribe({
|
|
26
|
+
next(t) {
|
|
27
|
+
const n = s.process(t);
|
|
28
|
+
r.next(n);
|
|
28
29
|
},
|
|
29
|
-
error(
|
|
30
|
-
|
|
30
|
+
error(t) {
|
|
31
|
+
r.error?.(t);
|
|
31
32
|
},
|
|
32
33
|
complete() {
|
|
33
|
-
|
|
34
|
+
r.complete?.();
|
|
34
35
|
}
|
|
35
36
|
});
|
|
36
37
|
return () => {
|
|
37
|
-
|
|
38
|
+
e(), s.dispose();
|
|
38
39
|
};
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
export {
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
m as createMouseRecognizer,
|
|
44
|
+
f as singlePointerRecognizer
|
|
44
45
|
};
|
|
45
46
|
//# sourceMappingURL=mouse.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mouse.js","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n signal.value.id = \"\";\n
|
|
1
|
+
{"version":3,"file":"mouse.js","sources":["../../src/browser/single-pointer/recognizer-from-mouse.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<MouseEvent>> {\n function processer(\n domEventSignal: DomEventSignal<MouseEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"mousedown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"mouseup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = \"\";\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = \"mouse\";\n v.button = button;\n v.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createMouseRecognizer(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = recognizer.process(event);\n observer.next(pointer);\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createMouseRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":";;;AAaO,SAASA,EACdC,IAAgC,IACqB;AACrD,WAASC,EACPC,GACAC,GACM;AACN,UAAM,IAAID,EAAe;AACzB,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF;AACE,QAAAF,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,IAAAI,EAAE,KAAK,IACPA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAc,SAChBA,EAAE,SAASF,GACXE,EAAE,WAAWH,MAAU,UAAU,EAAE,YAAY,IAAI,IAAI;AAAA,EACzD;AAEA,SAAOI,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAAgC,IAC2B;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAad,EAAsBC,CAAO,GAE1Cc,IAAQJ,EAAO,UAAU;AAAA,MAC7B,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAAH,EAAS,KAAKI,CAAO;AAAA,MACvB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("../stream-Cp6eCZs2.cjs"),l=require("../recognizer-DbiEtBOM.cjs"),u=require("../types-BGR5Mhw9.cjs");function a(o={}){function s(i,c){const e=i.value;if(!e.isPrimary)return;let t,r;switch(e.type){case"pointerdown":t="start",r=u.toSinglePointerButton(e.button);break;case"pointerup":t="end",r=u.toSinglePointerButton(e.button);break;case"pointercancel":t="cancel",r="none";break;default:t="move",r="none"}const n=c.value;n.id=`${e.pointerType}-${e.pointerId}`,n.phase=t,n.x=e.clientX,n.y=e.clientY,n.pageX=e.pageX,n.pageY=e.pageY,n.pointerType=m(e.pointerType),n.button=r,n.pressure=e.pressure}return l.createSinglePointerRecognizer(s,o)}function g(o={}){return s=>p.createStream(i=>{const c=a(o),e=s.subscribe({next(t){const r=c.process(t);r&&i.next(r)},error(t){i.error?.(t)},complete(){i.complete?.()}});return()=>{e(),c.dispose()}})}function m(o){switch(o){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}exports.createPointerRecognizer=a;exports.singlePointerRecognizer=g;
|
|
2
2
|
//# sourceMappingURL=pointer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"pointer.cjs","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":"qMAcO,SAASA,EACdC,EAAgC,GACuB,CACvD,SAASC,EACPC,EACAC,EACM,CACN,MAAM,EAAID,EAAe,MAEzB,GAAI,CAAC,EAAE,UACL,OAGF,IAAIE,EACAC,EACJ,OAAQ,EAAE,KAAA,CACR,IAAK,cACHD,EAAQ,QACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,YACHF,EAAQ,MACRC,EAASC,EAAAA,sBAAsB,EAAE,MAAM,EACvC,MACF,IAAK,gBACHF,EAAQ,SACRC,EAAS,OACT,MACF,QACED,EAAQ,OACRC,EAAS,MAAA,CAGb,MAAME,EAAIJ,EAAO,MACjBI,EAAE,GAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,GACtCA,EAAE,MAAQH,EACVG,EAAE,EAAI,EAAE,QACRA,EAAE,EAAI,EAAE,QACRA,EAAE,MAAQ,EAAE,MACZA,EAAE,MAAQ,EAAE,MACZA,EAAE,YAAcC,EAAqB,EAAE,WAAW,EAClDD,EAAE,OAASF,EACXE,EAAE,SAAW,EAAE,QACjB,CAEA,OAAOE,EAAAA,8BAA8BR,EAAWD,CAAO,CACzD,CAEO,SAASU,EACdV,EAAgC,GAC6B,CAC7D,OAAQW,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAaf,EAAwBC,CAAO,EAE5Ce,EAAQJ,EAAO,UAAU,CAC7B,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAW,QAAQE,CAAK,EACpCC,GACFJ,EAAS,KAAKI,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTL,EAAS,QAAQK,CAAG,CACtB,EACA,UAAW,CACTL,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL,CAEA,SAASN,EAAqBW,EAAiC,CAC7D,OAAQA,EAAA,CACN,IAAK,QACH,MAAO,QACT,IAAK,QACH,MAAO,QACT,IAAK,MACH,MAAO,MACT,QACE,MAAO,SAAA,CAEb"}
|
|
@@ -1,2 +1,63 @@
|
|
|
1
|
-
|
|
1
|
+
import { c as a } from "../stream-CDK0RZPi.js";
|
|
2
|
+
import { c as u } from "../recognizer-CGZKcxpa.js";
|
|
3
|
+
import { t as p } from "../types-Ccnqx90M.js";
|
|
4
|
+
function l(o = {}) {
|
|
5
|
+
function s(i, c) {
|
|
6
|
+
const e = i.value;
|
|
7
|
+
if (!e.isPrimary)
|
|
8
|
+
return;
|
|
9
|
+
let t, r;
|
|
10
|
+
switch (e.type) {
|
|
11
|
+
case "pointerdown":
|
|
12
|
+
t = "start", r = p(e.button);
|
|
13
|
+
break;
|
|
14
|
+
case "pointerup":
|
|
15
|
+
t = "end", r = p(e.button);
|
|
16
|
+
break;
|
|
17
|
+
case "pointercancel":
|
|
18
|
+
t = "cancel", r = "none";
|
|
19
|
+
break;
|
|
20
|
+
default:
|
|
21
|
+
t = "move", r = "none";
|
|
22
|
+
}
|
|
23
|
+
const n = c.value;
|
|
24
|
+
n.id = `${e.pointerType}-${e.pointerId}`, n.phase = t, n.x = e.clientX, n.y = e.clientY, n.pageX = e.pageX, n.pageY = e.pageY, n.pointerType = m(e.pointerType), n.button = r, n.pressure = e.pressure;
|
|
25
|
+
}
|
|
26
|
+
return u(s, o);
|
|
27
|
+
}
|
|
28
|
+
function P(o = {}) {
|
|
29
|
+
return (s) => a((i) => {
|
|
30
|
+
const c = l(o), e = s.subscribe({
|
|
31
|
+
next(t) {
|
|
32
|
+
const r = c.process(t);
|
|
33
|
+
r && i.next(r);
|
|
34
|
+
},
|
|
35
|
+
error(t) {
|
|
36
|
+
i.error?.(t);
|
|
37
|
+
},
|
|
38
|
+
complete() {
|
|
39
|
+
i.complete?.();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return () => {
|
|
43
|
+
e(), c.dispose();
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
function m(o) {
|
|
48
|
+
switch (o) {
|
|
49
|
+
case "mouse":
|
|
50
|
+
return "mouse";
|
|
51
|
+
case "touch":
|
|
52
|
+
return "touch";
|
|
53
|
+
case "pen":
|
|
54
|
+
return "pen";
|
|
55
|
+
default:
|
|
56
|
+
return "unknown";
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
l as createPointerRecognizer,
|
|
61
|
+
P as singlePointerRecognizer
|
|
62
|
+
};
|
|
2
63
|
//# sourceMappingURL=pointer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"pointer.js","sources":["../../src/browser/single-pointer/recognizer-from-pointer.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerOptions,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<PointerEvent>> {\n function processer(\n domEventSignal: DomEventSignal<PointerEvent>,\n signal: SinglePointerSignal,\n ): void {\n const e = domEventSignal.value;\n\n if (!e.isPrimary) {\n return;\n }\n\n let phase: SinglePointerPhase;\n let button: SinglePointerButton;\n switch (e.type) {\n case \"pointerdown\":\n phase = \"start\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointerup\":\n phase = \"end\";\n button = toSinglePointerButton(e.button);\n break;\n case \"pointercancel\":\n phase = \"cancel\";\n button = \"none\";\n break;\n default:\n phase = \"move\";\n button = \"none\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.id = `${e.pointerType}-${e.pointerId}`;\n v.phase = phase;\n v.x = e.clientX;\n v.y = e.clientY;\n v.pageX = e.pageX;\n v.pageY = e.pageY;\n v.pointerType = normalizePointerType(e.pointerType);\n v.button = button;\n v.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createPointerRecognizer(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n\nfunction normalizePointerType(type: string): SinglePointerType {\n switch (type) {\n case \"mouse\":\n return \"mouse\";\n case \"touch\":\n return \"touch\";\n case \"pen\":\n return \"pen\";\n default:\n return \"unknown\";\n }\n}\n"],"names":["createPointerRecognizer","options","processer","domEventSignal","signal","phase","button","toSinglePointerButton","v","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","createStream","observer","recognizer","unsub","event","pointer","err","type"],"mappings":";;;AAcO,SAASA,EACdC,IAAgC,IACuB;AACvD,WAASC,EACPC,GACAC,GACM;AACN,UAAM,IAAID,EAAe;AAEzB,QAAI,CAAC,EAAE;AACL;AAGF,QAAIE,GACAC;AACJ,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAD,IAAQ,SACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,OACRC,IAASC,EAAsB,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAF,IAAQ,UACRC,IAAS;AACT;AAAA,MACF;AACE,QAAAD,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,UAAME,IAAIJ,EAAO;AACjB,IAAAI,EAAE,KAAK,GAAG,EAAE,WAAW,IAAI,EAAE,SAAS,IACtCA,EAAE,QAAQH,GACVG,EAAE,IAAI,EAAE,SACRA,EAAE,IAAI,EAAE,SACRA,EAAE,QAAQ,EAAE,OACZA,EAAE,QAAQ,EAAE,OACZA,EAAE,cAAcC,EAAqB,EAAE,WAAW,GAClDD,EAAE,SAASF,GACXE,EAAE,WAAW,EAAE;AAAA,EACjB;AAEA,SAAOE,EAA8BR,GAAWD,CAAO;AACzD;AAEO,SAASU,EACdV,IAAgC,IAC6B;AAC7D,SAAO,CAACW,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAaf,EAAwBC,CAAO,GAE5Ce,IAAQJ,EAAO,UAAU;AAAA,MAC7B,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAW,QAAQE,CAAK;AACxC,QAAIC,KACFJ,EAAS,KAAKI,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAL,EAAS,QAAQK,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAL,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;AAEA,SAASN,EAAqBW,GAAiC;AAC7D,UAAQA,GAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../stream-Cp6eCZs2.cjs"),p=require("../recognizer-DbiEtBOM.cjs");function i(s={}){function u(r,o){const n=r.value,e=n.touches[0]??n.changedTouches[0];if(!e)return;let t;switch(n.type){case"touchstart":t="start";break;case"touchend":t="end";break;case"touchcancel":t="cancel";break;default:t="move"}const c=o.value;c.phase=t,c.x=e.clientX,c.y=e.clientY,c.pageX=e.pageX,c.pageY=e.pageY,c.pointerType="touch",c.button="none",c.pressure=e.force||.5}return p.createSinglePointerRecognizer(u,s)}function g(s={}){return u=>a.createStream(r=>{const o=i(s),n=u.subscribe({next(e){const t=o.process(e);t&&r.next(t)},error(e){r.error?.(e)},complete(){r.complete?.()}});return()=>{n(),o.dispose()}})}exports.createTouchRecognizer=i;exports.singlePointerRecognizer=g;
|
|
2
2
|
//# sourceMappingURL=touch.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"touch.cjs","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): void {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n signal.value.phase = phase;\n
|
|
1
|
+
{"version":3,"file":"touch.cjs","sources":["../../src/browser/single-pointer/recognizer-from-touch.ts"],"sourcesContent":["import type { Operator } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DeepMutable } from \"../../internal/types.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { createSinglePointerRecognizer, type SinglePointerRecognizer } from \"./recognizer.js\";\nimport type { SinglePointer, SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerOptions, SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerOptions = {},\n): SinglePointerRecognizer<DomEventSignal<TouchEvent>> {\n function processer(event: DomEventSignal<TouchEvent>, signal: SinglePointerSignal): void {\n const e = event.value;\n const touch = e.touches[0] ?? e.changedTouches[0];\n if (!touch) {\n return;\n }\n\n let phase: SinglePointerPhase;\n switch (e.type) {\n case \"touchstart\":\n phase = \"start\";\n break;\n case \"touchend\":\n phase = \"end\";\n break;\n case \"touchcancel\":\n phase = \"cancel\";\n break;\n default:\n phase = \"move\";\n }\n\n const v = signal.value as DeepMutable<SinglePointer>;\n v.phase = phase;\n v.x = touch.clientX;\n v.y = touch.clientY;\n v.pageX = touch.pageX;\n v.pageY = touch.pageY;\n v.pointerType = \"touch\";\n v.button = \"none\";\n v.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const recognizer = createTouchRecognizer(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = recognizer.process(event);\n if (pointer) {\n observer.next(pointer);\n }\n },\n error(err) {\n observer.error?.(err);\n },\n complete() {\n observer.complete?.();\n },\n });\n\n return () => {\n unsub();\n recognizer.dispose();\n };\n });\n}\n"],"names":["createTouchRecognizer","options","processer","event","signal","e","touch","phase","v","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":"kKAQO,SAASA,EACdC,EAAgC,GACqB,CACrD,SAASC,EAAUC,EAAmCC,EAAmC,CACvF,MAAMC,EAAIF,EAAM,MACVG,EAAQD,EAAE,QAAQ,CAAC,GAAKA,EAAE,eAAe,CAAC,EAChD,GAAI,CAACC,EACH,OAGF,IAAIC,EACJ,OAAQF,EAAE,KAAA,CACR,IAAK,aACHE,EAAQ,QACR,MACF,IAAK,WACHA,EAAQ,MACR,MACF,IAAK,cACHA,EAAQ,SACR,MACF,QACEA,EAAQ,MAAA,CAGZ,MAAMC,EAAIJ,EAAO,MACjBI,EAAE,MAAQD,EACVC,EAAE,EAAIF,EAAM,QACZE,EAAE,EAAIF,EAAM,QACZE,EAAE,MAAQF,EAAM,MAChBE,EAAE,MAAQF,EAAM,MAChBE,EAAE,YAAc,QAChBA,EAAE,OAAS,OACXA,EAAE,SAAWF,EAAM,OAAS,EAC9B,CAEA,OAAOG,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAAgC,GAC2B,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAad,EAAsBC,CAAO,EAE1Cc,EAAQJ,EAAO,UAAU,CAC7B,KAAKR,EAAO,CACV,MAAMa,EAAUF,EAAW,QAAQX,CAAK,EACpCa,GACFH,EAAS,KAAKG,CAAO,CAEzB,EACA,MAAMC,EAAK,CACTJ,EAAS,QAAQI,CAAG,CACtB,EACA,UAAW,CACTJ,EAAS,WAAA,CACX,CAAA,CACD,EAED,MAAO,IAAM,CACXE,EAAA,EACAD,EAAW,QAAA,CACb,CACF,CAAC,CACL"}
|