cereb 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/single-pointer/index.d.ts +1 -1
  3. package/dist/browser/single-pointer/index.d.ts.map +1 -1
  4. package/dist/browser/single-pointer/mouse.d.ts +1 -2
  5. package/dist/browser/single-pointer/mouse.d.ts.map +1 -1
  6. package/dist/browser/single-pointer/pointer.d.ts +1 -2
  7. package/dist/browser/single-pointer/pointer.d.ts.map +1 -1
  8. package/dist/browser/single-pointer/recognizer-from-mouse.d.ts +7 -0
  9. package/dist/browser/single-pointer/recognizer-from-mouse.d.ts.map +1 -0
  10. package/dist/browser/single-pointer/recognizer-from-pointer.d.ts +8 -0
  11. package/dist/browser/single-pointer/recognizer-from-pointer.d.ts.map +1 -0
  12. package/dist/browser/single-pointer/recognizer-from-touch.d.ts +7 -0
  13. package/dist/browser/single-pointer/recognizer-from-touch.d.ts.map +1 -0
  14. package/dist/browser/single-pointer/recognizer.d.ts +13 -0
  15. package/dist/browser/single-pointer/recognizer.d.ts.map +1 -0
  16. package/dist/browser/single-pointer/touch.d.ts +1 -2
  17. package/dist/browser/single-pointer/touch.d.ts.map +1 -1
  18. package/dist/index.cjs +1 -1
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +16 -16
  21. package/dist/index.js.map +1 -1
  22. package/dist/{emitter-CyT5OiQO.cjs → recognizer-BrqdN-1T.cjs} +2 -2
  23. package/dist/recognizer-BrqdN-1T.cjs.map +1 -0
  24. package/dist/{emitter-FFAuyJ19.js → recognizer-FFAuyJ19.js} +1 -1
  25. package/dist/recognizer-FFAuyJ19.js.map +1 -0
  26. package/dist/single-pointer/mouse.cjs +1 -1
  27. package/dist/single-pointer/mouse.cjs.map +1 -1
  28. package/dist/single-pointer/mouse.js +17 -17
  29. package/dist/single-pointer/mouse.js.map +1 -1
  30. package/dist/single-pointer/touch.cjs +1 -1
  31. package/dist/single-pointer/touch.cjs.map +1 -1
  32. package/dist/single-pointer/touch.js +9 -9
  33. package/dist/single-pointer/touch.js.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/browser/single-pointer/emitter.d.ts +0 -13
  36. package/dist/browser/single-pointer/emitter.d.ts.map +0 -1
  37. package/dist/browser/single-pointer/mouse-emitter.d.ts +0 -7
  38. package/dist/browser/single-pointer/mouse-emitter.d.ts.map +0 -1
  39. package/dist/browser/single-pointer/pointer-emitter.d.ts +0 -8
  40. package/dist/browser/single-pointer/pointer-emitter.d.ts.map +0 -1
  41. package/dist/browser/single-pointer/touch-emitter.d.ts +0 -7
  42. package/dist/browser/single-pointer/touch-emitter.d.ts.map +0 -1
  43. package/dist/emitter-CyT5OiQO.cjs.map +0 -1
  44. package/dist/emitter-FFAuyJ19.js.map +0 -1
package/README.md CHANGED
@@ -58,11 +58,11 @@ You can also build a `singlePointer` stream from touch events:
58
58
 
59
59
  ```typescript
60
60
  import { touchEvents, pipe } from "cereb";
61
- import { singlePointerEmitter } from "cereb/single-pointer/touch";
61
+ import { singlePointerRecognizer } from "cereb/single-pointer/touch";
62
62
 
63
63
  const pointSomething$ = pipe(
64
64
  touchEvents(somethingElement),
65
- singlePointerEmitter(),
65
+ singlePointerRecognizer(),
66
66
  );
67
67
 
68
68
  pointSomething$.subscribe((signal) => { /* .. */ });
@@ -1,4 +1,4 @@
1
- export { singlePointer } from './pointer-emitter.js';
1
+ export { singlePointer } from './recognizer-from-pointer.js';
2
2
  export type { SINGLE_POINTER_SIGNAL_KIND, SinglePointer, SinglePointerSignal, } from './single-pointer-signal.js';
3
3
  export type { SinglePointerButton, SinglePointerPhase, SinglePointerType } from './types.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EACV,0BAA0B,EAC1B,aAAa,EACb,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,3 +1,2 @@
1
- export { createMouseEmitter, mouseToSinglePointer as singlePointer } from './mouse-emitter.js';
2
- export type { SinglePointer } from './single-pointer-signal.js';
1
+ export { createMouseRecognizer, singlePointerFromMouse as singlePointerRecognizer, } from './recognizer-from-mouse.js';
3
2
  //# sourceMappingURL=mouse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC/F,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,IAAI,uBAAuB,GAClD,MAAM,4BAA4B,CAAC"}
@@ -1,3 +1,2 @@
1
- export type { createPointerEmitter, pointerToSinglePointer, singlePointer, } from './pointer-emitter.js';
2
- export type { SinglePointer } from './single-pointer-signal.js';
1
+ export type { createPointerRecognizer, singlePointerFromPointer as singlePointerRecognizer, } from './recognizer-from-pointer.js';
3
2
  //# sourceMappingURL=pointer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/pointer.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,GACd,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC"}
1
+ {"version":3,"file":"pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/pointer.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,uBAAuB,EACvB,wBAAwB,IAAI,uBAAuB,GACpD,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { Operator } from '../../core/stream.js';
2
+ import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
+ import { SinglePointerRecognizer, SinglePointerRecognizerOptions } from './recognizer.js';
4
+ import { SinglePointerSignal } from './single-pointer-signal.js';
5
+ export declare function createMouseRecognizer(options?: SinglePointerRecognizerOptions): SinglePointerRecognizer<DomEventSignal<MouseEvent>>;
6
+ export declare function singlePointerFromMouse(options?: SinglePointerRecognizerOptions): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal>;
7
+ //# sourceMappingURL=recognizer-from-mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer-from-mouse.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,8BAAmC,GAC3C,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAuB3D"}
@@ -0,0 +1,8 @@
1
+ import { Operator, Stream } from '../../core/stream.js';
2
+ import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
+ import { SinglePointerRecognizer, SinglePointerRecognizerOptions } from './recognizer.js';
4
+ import { SinglePointerSignal } from './single-pointer-signal.js';
5
+ export declare function createPointerRecognizer(options?: SinglePointerRecognizerOptions): SinglePointerRecognizer<DomEventSignal<PointerEvent>>;
6
+ export declare function singlePointerFromPointer(options?: SinglePointerRecognizerOptions): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal>;
7
+ export declare function singlePointer(target: EventTarget): Stream<SinglePointerSignal>;
8
+ //# sourceMappingURL=recognizer-from-pointer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer-from-pointer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-pointer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtE,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CA2CvD;AAED,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,8BAAmC,GAC3C,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAyB7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAG9E"}
@@ -0,0 +1,7 @@
1
+ import { Operator } from '../../core/stream.js';
2
+ import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
+ import { SinglePointerRecognizer, SinglePointerRecognizerOptions } from './recognizer.js';
4
+ import { SinglePointerSignal } from './single-pointer-signal.js';
5
+ export declare function createTouchRecognizer(options?: SinglePointerRecognizerOptions): SinglePointerRecognizer<DomEventSignal<TouchEvent>>;
6
+ export declare function singlePointerFromTouch(options?: SinglePointerRecognizerOptions): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal>;
7
+ //# sourceMappingURL=recognizer-from-touch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer-from-touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer-from-touch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACpC,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkCrD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,8BAAmC,GAC3C,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
@@ -0,0 +1,13 @@
1
+ import { Signal } from '../../core/signal.js';
2
+ import { SinglePointerSignal } from './single-pointer-signal.js';
3
+ export interface SinglePointerRecognizer<InputSignal extends Signal> {
4
+ process(event: InputSignal): SinglePointerSignal;
5
+ readonly isActive: boolean;
6
+ reset(): void;
7
+ dispose(): void;
8
+ }
9
+ export interface SinglePointerRecognizerOptions {
10
+ pooling?: boolean;
11
+ }
12
+ export declare function createSinglePointerRecognizer<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void, options?: SinglePointerRecognizerOptions): SinglePointerRecognizer<InputSignal>;
13
+ //# sourceMappingURL=recognizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/recognizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,WAAW,uBAAuB,CAAC,WAAW,SAAS,MAAM;IACjE,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,6BAA6B,CAAC,WAAW,SAAS,MAAM,EACtE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,KAAK,IAAI,EACjF,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CAAC,WAAW,CAAC,CA8CtC"}
@@ -1,3 +1,2 @@
1
- export type { SinglePointer } from './single-pointer-signal.js';
2
- export { createTouchEmitter, touchToSinglePointer as singlePointer } from './touch-emitter.js';
1
+ export { createTouchRecognizer, singlePointerFromTouch as singlePointerRecognizer, } from './recognizer-from-touch.js';
3
2
  //# sourceMappingURL=touch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/touch.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"touch.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/touch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,IAAI,uBAAuB,GAClD,MAAM,4BAA4B,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("./emitter-CyT5OiQO.cjs"),i=require("./stream-Cp6eCZs2.cjs"),v=require("./types-BGR5Mhw9.cjs"),f="dom-event";function p(t){return m.createSignal(f,t)}function h(t,o,c){return i.createStream(n=>{const e=r=>{n.next(p(r))};return t.addEventListener(o,e,c),()=>{t.removeEventListener(o,e,c)}})}const s=["mousedown","mousemove","mouseup"];function S(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<s.length;e++){const r=s[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<s.length;e++){const r=s[e];t.removeEventListener(r,n,o)}}})}const a=["pointerdown","pointermove","pointerup","pointercancel"];function d(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<a.length;e++){const r=a[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<a.length;e++){const r=a[e];t.removeEventListener(r,n,o)}}})}const l=["touchstart","touchmove","touchend","touchcancel"];function b(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<l.length;e++){const r=l[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<l.length;e++){const r=l[e];t.removeEventListener(r,n,o)}}})}function P(t={}){function o(c,n){const e=c.value;if(!e.isPrimary)return;let r,u;switch(e.type){case"pointerdown":r="start",u=v.toSinglePointerButton(e.button);break;case"pointerup":r="end",u=v.toSinglePointerButton(e.button);break;case"pointercancel":r="cancel",u="none";break;default:r="move",u="none"}n.value.id=`${e.pointerType}-${e.pointerId}`,n.value.phase=r,n.value.x=e.clientX,n.value.y=e.clientY,n.value.pageX=e.pageX,n.value.pageY=e.pageY,n.value.pointerType=y(e.pointerType),n.value.button=u,n.value.pressure=e.pressure}return m.createSinglePointerEmitter(o,t)}function N(t={}){return o=>i.createStream(c=>{const n=P(t),e=o.subscribe({next(r){const u=n.process(r);u&&c.next(u)},error(r){c.error?.(r)},complete(){c.complete?.()}});return()=>{e(),n.dispose()}})}function T(t){const o=d(t);return N()(o)}function y(t){switch(t){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}function L(...t){return o=>E(o,...t)}function E(t,...o){return o.reduce((c,n)=>n(c),t)}exports.createObjectPool=m.createObjectPool;exports.setCerebDeviceId=m.setCerebDeviceId;exports.createStream=i.createStream;exports.compose=L;exports.domEvent=h;exports.mouseEvents=S;exports.pipe=E;exports.pointerEvents=d;exports.singlePointer=T;exports.touchEvents=b;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("./recognizer-BrqdN-1T.cjs"),i=require("./stream-Cp6eCZs2.cjs"),m=require("./types-BGR5Mhw9.cjs"),f="dom-event";function p(t){return v.createSignal(f,t)}function h(t,o,c){return i.createStream(n=>{const e=r=>{n.next(p(r))};return t.addEventListener(o,e,c),()=>{t.removeEventListener(o,e,c)}})}const s=["mousedown","mousemove","mouseup"];function S(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<s.length;e++){const r=s[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<s.length;e++){const r=s[e];t.removeEventListener(r,n,o)}}})}const a=["pointerdown","pointermove","pointerup","pointercancel"];function d(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<a.length;e++){const r=a[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<a.length;e++){const r=a[e];t.removeEventListener(r,n,o)}}})}const l=["touchstart","touchmove","touchend","touchcancel"];function b(t,o){return i.createStream(c=>{const n=e=>{c.next(p(e))};for(let e=0;e<l.length;e++){const r=l[e];t.addEventListener(r,n,o)}return()=>{for(let e=0;e<l.length;e++){const r=l[e];t.removeEventListener(r,n,o)}}})}function P(t={}){function o(c,n){const e=c.value;if(!e.isPrimary)return;let r,u;switch(e.type){case"pointerdown":r="start",u=m.toSinglePointerButton(e.button);break;case"pointerup":r="end",u=m.toSinglePointerButton(e.button);break;case"pointercancel":r="cancel",u="none";break;default:r="move",u="none"}n.value.id=`${e.pointerType}-${e.pointerId}`,n.value.phase=r,n.value.x=e.clientX,n.value.y=e.clientY,n.value.pageX=e.pageX,n.value.pageY=e.pageY,n.value.pointerType=T(e.pointerType),n.value.button=u,n.value.pressure=e.pressure}return v.createSinglePointerRecognizer(o,t)}function g(t={}){return o=>i.createStream(c=>{const n=P(t),e=o.subscribe({next(r){const u=n.process(r);u&&c.next(u)},error(r){c.error?.(r)},complete(){c.complete?.()}});return()=>{e(),n.dispose()}})}function N(t){const o=d(t);return g()(o)}function T(t){switch(t){case"mouse":return"mouse";case"touch":return"touch";case"pen":return"pen";default:return"unknown"}}function y(...t){return o=>E(o,...t)}function E(t,...o){return o.reduce((c,n)=>n(c),t)}exports.createObjectPool=v.createObjectPool;exports.setCerebDeviceId=v.setCerebDeviceId;exports.createStream=i.createStream;exports.compose=y;exports.domEvent=h;exports.mouseEvents=S;exports.pipe=E;exports.pointerEvents=d;exports.singlePointer=N;exports.touchEvents=b;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/browser/dom-event/dom-event-signal.ts","../src/browser/dom-event/dom-event.ts","../src/browser/dom-event/mouse-events.ts","../src/browser/dom-event/pointer-events.ts","../src/browser/dom-event/touch-events.ts","../src/browser/single-pointer/pointer-emitter.ts","../src/ochestrations/compose.ts","../src/ochestrations/pipe.ts"],"sourcesContent":["import { createSignal, type Signal } from \"../../core/signal.js\";\n\nexport interface DomEventSignal<E extends Event> extends Signal<\"dom-event\", E> {}\n\nexport const DOM_EVENT_SIGNAL_KIND = \"dom-event\" as const;\n\nexport function createDomEventSignal<E extends Event>(event: E): DomEventSignal<E> {\n return createSignal(DOM_EVENT_SIGNAL_KIND, event);\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nexport function domEvent(\n target: EventTarget,\n eventName: string,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<Event>> {\n return createStream<DomEventSignal<Event>>((observer) => {\n const handler = (e: Event) => {\n observer.next(createDomEventSignal(e));\n };\n\n target.addEventListener(eventName, handler, options);\n\n return () => {\n target.removeEventListener(eventName, handler, options);\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseup\"] as const;\n\nexport function mouseEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<MouseEvent>> {\n return createStream<DomEventSignal<MouseEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as MouseEvent));\n };\n\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst POINTER_EVENTS = [\"pointerdown\", \"pointermove\", \"pointerup\", \"pointercancel\"] as const;\n\nexport function pointerEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<PointerEvent>> {\n return createStream<DomEventSignal<PointerEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as PointerEvent));\n };\n\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst TOUCH_EVENTS = [\"touchstart\", \"touchmove\", \"touchend\", \"touchcancel\"] as const;\n\nexport function touchEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<TouchEvent>> {\n return createStream((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as TouchEvent));\n };\n\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import type { Operator, Stream } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { pointerEvents } from \"../dom-event/pointer-events.js\";\nimport {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.id = `${e.pointerType}-${e.pointerId}`;\n signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = normalizePointerType(e.pointerType);\n signal.value.button = button;\n signal.value.pressure = e.pressure;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function pointerToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createPointerEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n\nexport function singlePointer(target: EventTarget): Stream<SinglePointerSignal> {\n const source = pointerEvents(target);\n return pointerToSinglePointer()(source);\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","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { pipe } from \"../index.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => pipe(source, ...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\n\nexport function pipe<T extends Signal>(source: Stream<T>): Stream<T>;\nexport function pipe<T extends Signal, A extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n): Stream<A>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Stream<B>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Stream<C>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Stream<D>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Stream<E>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n): Stream<F>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n): Stream<G>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n H extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n): Stream<H>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal> {\n return operators.reduce((prev, op) => op(prev), source as Stream<Signal>);\n}\n"],"names":["DOM_EVENT_SIGNAL_KIND","createDomEventSignal","event","createSignal","domEvent","target","eventName","options","createStream","observer","handler","e","MOUSE_EVENTS","mouseEvents","i","POINTER_EVENTS","pointerEvents","TOUCH_EVENTS","touchEvents","createPointerEmitter","processer","domEventSignal","signal","phase","button","toSinglePointerButton","normalizePointerType","createSinglePointerEmitter","pointerToSinglePointer","source","emitter","unsub","pointer","err","singlePointer","type","compose","operators","pipe","prev","op"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/browser/dom-event/dom-event-signal.ts","../src/browser/dom-event/dom-event.ts","../src/browser/dom-event/mouse-events.ts","../src/browser/dom-event/pointer-events.ts","../src/browser/dom-event/touch-events.ts","../src/browser/single-pointer/recognizer-from-pointer.ts","../src/ochestrations/compose.ts","../src/ochestrations/pipe.ts"],"sourcesContent":["import { createSignal, type Signal } from \"../../core/signal.js\";\n\nexport interface DomEventSignal<E extends Event> extends Signal<\"dom-event\", E> {}\n\nexport const DOM_EVENT_SIGNAL_KIND = \"dom-event\" as const;\n\nexport function createDomEventSignal<E extends Event>(event: E): DomEventSignal<E> {\n return createSignal(DOM_EVENT_SIGNAL_KIND, event);\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nexport function domEvent(\n target: EventTarget,\n eventName: string,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<Event>> {\n return createStream<DomEventSignal<Event>>((observer) => {\n const handler = (e: Event) => {\n observer.next(createDomEventSignal(e));\n };\n\n target.addEventListener(eventName, handler, options);\n\n return () => {\n target.removeEventListener(eventName, handler, options);\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseup\"] as const;\n\nexport function mouseEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<MouseEvent>> {\n return createStream<DomEventSignal<MouseEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as MouseEvent));\n };\n\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst POINTER_EVENTS = [\"pointerdown\", \"pointermove\", \"pointerup\", \"pointercancel\"] as const;\n\nexport function pointerEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<PointerEvent>> {\n return createStream<DomEventSignal<PointerEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as PointerEvent));\n };\n\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst TOUCH_EVENTS = [\"touchstart\", \"touchmove\", \"touchend\", \"touchcancel\"] as const;\n\nexport function touchEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<TouchEvent>> {\n return createStream((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as TouchEvent));\n };\n\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import type { Operator, Stream } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { pointerEvents } from \"../dom-event/pointer-events.js\";\nimport {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.id = `${e.pointerType}-${e.pointerId}`;\n signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = normalizePointerType(e.pointerType);\n signal.value.button = button;\n signal.value.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerRecognizerOptions = {},\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\nexport function singlePointer(target: EventTarget): Stream<SinglePointerSignal> {\n const source = pointerEvents(target);\n return singlePointerFromPointer()(source);\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","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { pipe } from \"../index.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => pipe(source, ...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\n\nexport function pipe<T extends Signal>(source: Stream<T>): Stream<T>;\nexport function pipe<T extends Signal, A extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n): Stream<A>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Stream<B>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Stream<C>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Stream<D>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Stream<E>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n): Stream<F>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n): Stream<G>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n H extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n): Stream<H>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal> {\n return operators.reduce((prev, op) => op(prev), source as Stream<Signal>);\n}\n"],"names":["DOM_EVENT_SIGNAL_KIND","createDomEventSignal","event","createSignal","domEvent","target","eventName","options","createStream","observer","handler","e","MOUSE_EVENTS","mouseEvents","i","POINTER_EVENTS","pointerEvents","TOUCH_EVENTS","touchEvents","createPointerRecognizer","processer","domEventSignal","signal","phase","button","toSinglePointerButton","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","recognizer","unsub","pointer","err","singlePointer","type","compose","operators","pipe","prev","op"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { a as v, c as d } from "./emitter-FFAuyJ19.js";
2
- import { b as k, s as D } from "./emitter-FFAuyJ19.js";
1
+ import { a as v, c as d } from "./recognizer-FFAuyJ19.js";
2
+ import { b as k, s as z } from "./recognizer-FFAuyJ19.js";
3
3
  import { c as i } from "./stream-CDK0RZPi.js";
4
4
  import { t as m } from "./types-Ccnqx90M.js";
5
5
  const f = "dom-event";
6
6
  function l(t) {
7
7
  return v(f, t);
8
8
  }
9
- function P(t, o, c) {
9
+ function L(t, o, c) {
10
10
  return i((n) => {
11
11
  const e = (r) => {
12
12
  n.next(l(r));
@@ -17,7 +17,7 @@ function P(t, o, c) {
17
17
  });
18
18
  }
19
19
  const s = ["mousedown", "mousemove", "mouseup"];
20
- function y(t, o) {
20
+ function g(t, o) {
21
21
  return i((c) => {
22
22
  const n = (e) => {
23
23
  c.next(l(e));
@@ -53,7 +53,7 @@ function E(t, o) {
53
53
  });
54
54
  }
55
55
  const p = ["touchstart", "touchmove", "touchend", "touchcancel"];
56
- function w(t, o) {
56
+ function y(t, o) {
57
57
  return i((c) => {
58
58
  const n = (e) => {
59
59
  c.next(l(e));
@@ -112,7 +112,7 @@ function N(t = {}) {
112
112
  };
113
113
  });
114
114
  }
115
- function _(t) {
115
+ function w(t) {
116
116
  const o = E(t);
117
117
  return N()(o);
118
118
  }
@@ -128,22 +128,22 @@ function b(t) {
128
128
  return "unknown";
129
129
  }
130
130
  }
131
- function I(...t) {
132
- return (o) => S(o, ...t);
131
+ function _(...t) {
132
+ return (o) => P(o, ...t);
133
133
  }
134
- function S(t, ...o) {
134
+ function P(t, ...o) {
135
135
  return o.reduce((c, n) => n(c), t);
136
136
  }
137
137
  export {
138
- I as compose,
138
+ _ as compose,
139
139
  k as createObjectPool,
140
140
  i as createStream,
141
- P as domEvent,
142
- y as mouseEvents,
143
- S as pipe,
141
+ L as domEvent,
142
+ g as mouseEvents,
143
+ P as pipe,
144
144
  E as pointerEvents,
145
- D as setCerebDeviceId,
146
- _ as singlePointer,
147
- w as touchEvents
145
+ z as setCerebDeviceId,
146
+ w as singlePointer,
147
+ y as touchEvents
148
148
  };
149
149
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/browser/dom-event/dom-event-signal.ts","../src/browser/dom-event/dom-event.ts","../src/browser/dom-event/mouse-events.ts","../src/browser/dom-event/pointer-events.ts","../src/browser/dom-event/touch-events.ts","../src/browser/single-pointer/pointer-emitter.ts","../src/ochestrations/compose.ts","../src/ochestrations/pipe.ts"],"sourcesContent":["import { createSignal, type Signal } from \"../../core/signal.js\";\n\nexport interface DomEventSignal<E extends Event> extends Signal<\"dom-event\", E> {}\n\nexport const DOM_EVENT_SIGNAL_KIND = \"dom-event\" as const;\n\nexport function createDomEventSignal<E extends Event>(event: E): DomEventSignal<E> {\n return createSignal(DOM_EVENT_SIGNAL_KIND, event);\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nexport function domEvent(\n target: EventTarget,\n eventName: string,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<Event>> {\n return createStream<DomEventSignal<Event>>((observer) => {\n const handler = (e: Event) => {\n observer.next(createDomEventSignal(e));\n };\n\n target.addEventListener(eventName, handler, options);\n\n return () => {\n target.removeEventListener(eventName, handler, options);\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseup\"] as const;\n\nexport function mouseEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<MouseEvent>> {\n return createStream<DomEventSignal<MouseEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as MouseEvent));\n };\n\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst POINTER_EVENTS = [\"pointerdown\", \"pointermove\", \"pointerup\", \"pointercancel\"] as const;\n\nexport function pointerEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<PointerEvent>> {\n return createStream<DomEventSignal<PointerEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as PointerEvent));\n };\n\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst TOUCH_EVENTS = [\"touchstart\", \"touchmove\", \"touchend\", \"touchcancel\"] as const;\n\nexport function touchEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<TouchEvent>> {\n return createStream((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as TouchEvent));\n };\n\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import type { Operator, Stream } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { pointerEvents } from \"../dom-event/pointer-events.js\";\nimport {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.id = `${e.pointerType}-${e.pointerId}`;\n signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = normalizePointerType(e.pointerType);\n signal.value.button = button;\n signal.value.pressure = e.pressure;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function pointerToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createPointerEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n\nexport function singlePointer(target: EventTarget): Stream<SinglePointerSignal> {\n const source = pointerEvents(target);\n return pointerToSinglePointer()(source);\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","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { pipe } from \"../index.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => pipe(source, ...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\n\nexport function pipe<T extends Signal>(source: Stream<T>): Stream<T>;\nexport function pipe<T extends Signal, A extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n): Stream<A>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Stream<B>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Stream<C>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Stream<D>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Stream<E>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n): Stream<F>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n): Stream<G>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n H extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n): Stream<H>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal> {\n return operators.reduce((prev, op) => op(prev), source as Stream<Signal>);\n}\n"],"names":["DOM_EVENT_SIGNAL_KIND","createDomEventSignal","event","createSignal","domEvent","target","eventName","options","createStream","observer","handler","e","MOUSE_EVENTS","mouseEvents","i","POINTER_EVENTS","pointerEvents","TOUCH_EVENTS","touchEvents","createPointerEmitter","processer","domEventSignal","signal","phase","button","toSinglePointerButton","normalizePointerType","createSinglePointerEmitter","pointerToSinglePointer","source","emitter","unsub","pointer","err","singlePointer","type","compose","operators","pipe","prev","op"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/browser/dom-event/dom-event-signal.ts","../src/browser/dom-event/dom-event.ts","../src/browser/dom-event/mouse-events.ts","../src/browser/dom-event/pointer-events.ts","../src/browser/dom-event/touch-events.ts","../src/browser/single-pointer/recognizer-from-pointer.ts","../src/ochestrations/compose.ts","../src/ochestrations/pipe.ts"],"sourcesContent":["import { createSignal, type Signal } from \"../../core/signal.js\";\n\nexport interface DomEventSignal<E extends Event> extends Signal<\"dom-event\", E> {}\n\nexport const DOM_EVENT_SIGNAL_KIND = \"dom-event\" as const;\n\nexport function createDomEventSignal<E extends Event>(event: E): DomEventSignal<E> {\n return createSignal(DOM_EVENT_SIGNAL_KIND, event);\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nexport function domEvent(\n target: EventTarget,\n eventName: string,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<Event>> {\n return createStream<DomEventSignal<Event>>((observer) => {\n const handler = (e: Event) => {\n observer.next(createDomEventSignal(e));\n };\n\n target.addEventListener(eventName, handler, options);\n\n return () => {\n target.removeEventListener(eventName, handler, options);\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseup\"] as const;\n\nexport function mouseEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<MouseEvent>> {\n return createStream<DomEventSignal<MouseEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as MouseEvent));\n };\n\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < MOUSE_EVENTS.length; i++) {\n const eventName = MOUSE_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst POINTER_EVENTS = [\"pointerdown\", \"pointermove\", \"pointerup\", \"pointercancel\"] as const;\n\nexport function pointerEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<PointerEvent>> {\n return createStream<DomEventSignal<PointerEvent>>((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as PointerEvent));\n };\n\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < POINTER_EVENTS.length; i++) {\n const eventName = POINTER_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import { createStream, type Stream } from \"../../core/stream.js\";\nimport { createDomEventSignal, type DomEventSignal } from \"./dom-event-signal.js\";\n\nconst TOUCH_EVENTS = [\"touchstart\", \"touchmove\", \"touchend\", \"touchcancel\"] as const;\n\nexport function touchEvents(\n target: EventTarget,\n options?: AddEventListenerOptions,\n): Stream<DomEventSignal<TouchEvent>> {\n return createStream((observer) => {\n const handler = (event: Event) => {\n observer.next(createDomEventSignal(event as TouchEvent));\n };\n\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.addEventListener(eventName, handler, options);\n }\n\n return () => {\n for (let i = 0; i < TOUCH_EVENTS.length; i++) {\n const eventName = TOUCH_EVENTS[i];\n target.removeEventListener(eventName, handler, options);\n }\n };\n });\n}\n","import type { Operator, Stream } from \"../../core/stream.js\";\nimport { createStream } from \"../../core/stream.js\";\nimport type { DomEventSignal } from \"../dom-event/dom-event-signal.js\";\nimport { pointerEvents } from \"../dom-event/pointer-events.js\";\nimport {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n type SinglePointerType,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createPointerRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.id = `${e.pointerType}-${e.pointerId}`;\n signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = normalizePointerType(e.pointerType);\n signal.value.button = button;\n signal.value.pressure = e.pressure;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromPointer(\n options: SinglePointerRecognizerOptions = {},\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\nexport function singlePointer(target: EventTarget): Stream<SinglePointerSignal> {\n const source = pointerEvents(target);\n return singlePointerFromPointer()(source);\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","import type { Signal } from \"../core/signal.js\";\nimport type { Operator } from \"../core/stream.js\";\nimport { pipe } from \"../index.js\";\n\nexport function compose<T extends Signal, A extends Signal>(op1: Operator<T, A>): Operator<T, A>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Operator<T, B>;\nexport function compose<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Operator<T, C>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Operator<T, D>;\nexport function compose<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Operator<T, E>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal>;\nexport function compose(...operators: Operator<Signal, Signal>[]): Operator<Signal, Signal> {\n return (source) => pipe(source, ...operators);\n}\n","import type { Signal } from \"../core/signal.js\";\nimport type { Operator, Stream } from \"../core/stream.js\";\n\nexport function pipe<T extends Signal>(source: Stream<T>): Stream<T>;\nexport function pipe<T extends Signal, A extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n): Stream<A>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n): Stream<B>;\nexport function pipe<T extends Signal, A extends Signal, B extends Signal, C extends Signal>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n): Stream<C>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n): Stream<D>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n): Stream<E>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n): Stream<F>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n): Stream<G>;\nexport function pipe<\n T extends Signal,\n A extends Signal,\n B extends Signal,\n C extends Signal,\n D extends Signal,\n E extends Signal,\n F extends Signal,\n G extends Signal,\n H extends Signal,\n>(\n source: Stream<T>,\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n): Stream<H>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal>;\nexport function pipe<T extends Signal>(\n source: Stream<T>,\n ...operators: Operator<Signal, Signal>[]\n): Stream<Signal> {\n return operators.reduce((prev, op) => op(prev), source as Stream<Signal>);\n}\n"],"names":["DOM_EVENT_SIGNAL_KIND","createDomEventSignal","event","createSignal","domEvent","target","eventName","options","createStream","observer","handler","e","MOUSE_EVENTS","mouseEvents","i","POINTER_EVENTS","pointerEvents","TOUCH_EVENTS","touchEvents","createPointerRecognizer","processer","domEventSignal","signal","phase","button","toSinglePointerButton","normalizePointerType","createSinglePointerRecognizer","singlePointerFromPointer","source","recognizer","unsub","pointer","err","singlePointer","type","compose","operators","pipe","prev","op"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";let c="";function f(){return c}function v(e){c=e}function s(e,i){return{kind:e,value:i,deviceId:f(),createdAt:performance.now()}}function g(e,i,o={}){const{initialSize:t=0,maxSize:u=100}=o,n=[];for(let r=0;r<t;r++)n.push(e());return{get size(){return n.length},acquire(){return n.length>0?n.pop():e()},release(r){n.length<u&&(i(r),n.push(r))}}}const S="single-pointer";function p(e){return s(S,e)}function d(){return p({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"unknown",button:"none",pressure:.5})}function P(e){e.value.phase="move",e.value.x=0,e.value.y=0,e.value.pageX=0,e.value.pageY=0,e.value.pointerType="unknown",e.value.button="none",e.value.pressure=.5,e.updatedAt=performance.now()}const l=g(d,P,{initialSize:20,maxSize:100});function h(e,i={}){const{pooling:o=!1}=i;let t=null;function u(){return o?l.acquire():p({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"mouse",button:"none",pressure:.5})}function n(){t&&o&&l.release(t),t=null}return{process:r=>{const a=u();return e(r,a),n(),t=a,a},get isActive(){return t!==null},reset(){n()},dispose(){this.reset()}}}exports.createObjectPool=g;exports.createSignal=s;exports.createSinglePointerEmitter=h;exports.setCerebDeviceId=v;
2
- //# sourceMappingURL=emitter-CyT5OiQO.cjs.map
1
+ "use strict";let c="";function f(){return c}function v(e){c=e}function s(e,i){return{kind:e,value:i,deviceId:f(),createdAt:performance.now()}}function g(e,i,o={}){const{initialSize:t=0,maxSize:u=100}=o,n=[];for(let r=0;r<t;r++)n.push(e());return{get size(){return n.length},acquire(){return n.length>0?n.pop():e()},release(r){n.length<u&&(i(r),n.push(r))}}}const S="single-pointer";function p(e){return s(S,e)}function d(){return p({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"unknown",button:"none",pressure:.5})}function P(e){e.value.phase="move",e.value.x=0,e.value.y=0,e.value.pageX=0,e.value.pageY=0,e.value.pointerType="unknown",e.value.button="none",e.value.pressure=.5,e.updatedAt=performance.now()}const l=g(d,P,{initialSize:20,maxSize:100});function h(e,i={}){const{pooling:o=!1}=i;let t=null;function u(){return o?l.acquire():p({id:"",phase:"move",x:0,y:0,pageX:0,pageY:0,pointerType:"mouse",button:"none",pressure:.5})}function n(){t&&o&&l.release(t),t=null}return{process:r=>{const a=u();return e(r,a),n(),t=a,a},get isActive(){return t!==null},reset(){n()},dispose(){this.reset()}}}exports.createObjectPool=g;exports.createSignal=s;exports.createSinglePointerRecognizer=h;exports.setCerebDeviceId=v;
2
+ //# sourceMappingURL=recognizer-BrqdN-1T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer-BrqdN-1T.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/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 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 SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerRecognizerOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerRecognizerOptions = {},\n): SinglePointerRecognizer<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","createSinglePointerRecognizer","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,EAA0C,GACJ,CACtC,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"}
@@ -98,4 +98,4 @@ export {
98
98
  P as c,
99
99
  h as s
100
100
  };
101
- //# sourceMappingURL=emitter-FFAuyJ19.js.map
101
+ //# sourceMappingURL=recognizer-FFAuyJ19.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognizer-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/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 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 SinglePointerRecognizer<InputSignal extends Signal> {\n process(event: InputSignal): SinglePointerSignal;\n readonly isActive: boolean;\n reset(): void;\n dispose(): void;\n}\n\nexport interface SinglePointerRecognizerOptions {\n pooling?: boolean;\n}\n\nexport function createSinglePointerRecognizer<InputSignal extends Signal>(\n processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void,\n options: SinglePointerRecognizerOptions = {},\n): SinglePointerRecognizer<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","createSinglePointerRecognizer","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,IAA0C,IACJ;AACtC,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,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../stream-Cp6eCZs2.cjs"),p=require("../emitter-CyT5OiQO.cjs"),s=require("../types-BGR5Mhw9.cjs");function i(n={}){function c(u,e){const t=u.value;let o,r;switch(t.type){case"mousedown":o="start",r=s.toSinglePointerButton(t.button);break;case"mouseup":o="end",r=s.toSinglePointerButton(t.button);break;default:o="move",r="none"}e.value.id="",e.value.phase=o,e.value.x=t.clientX,e.value.y=t.clientY,e.value.pageX=t.pageX,e.value.pageY=t.pageY,e.value.pointerType="mouse",e.value.button=r,e.value.pressure=o==="move"&&t.buttons===0?0:.5}return p.createSinglePointerEmitter(c,n)}function l(n={}){return c=>a.createStream(u=>{const e=i(n),t=c.subscribe({next(o){const r=e.process(o);u.next(r)},error(o){u.error?.(o)},complete(){u.complete?.()}});return()=>{t(),e.dispose()}})}exports.createMouseEmitter=i;exports.singlePointer=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("../stream-Cp6eCZs2.cjs"),p=require("../recognizer-BrqdN-1T.cjs"),s=require("../types-BGR5Mhw9.cjs");function i(u={}){function c(n,e){const t=n.value;let o,r;switch(t.type){case"mousedown":o="start",r=s.toSinglePointerButton(t.button);break;case"mouseup":o="end",r=s.toSinglePointerButton(t.button);break;default:o="move",r="none"}e.value.id="",e.value.phase=o,e.value.x=t.clientX,e.value.y=t.clientY,e.value.pageX=t.pageX,e.value.pageY=t.pageY,e.value.pointerType="mouse",e.value.button=r,e.value.pressure=o==="move"&&t.buttons===0?0:.5}return p.createSinglePointerRecognizer(c,u)}function l(u={}){return c=>a.createStream(n=>{const e=i(u),t=c.subscribe({next(o){const r=e.process(o);n.next(r)},error(o){n.error?.(o)},complete(){n.complete?.()}});return()=>{t(),e.dispose()}})}exports.createMouseRecognizer=i;exports.singlePointerRecognizer=l;
2
2
  //# sourceMappingURL=mouse.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.cjs","sources":["../../src/browser/single-pointer/mouse-emitter.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 {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = \"mouse\";\n signal.value.button = button;\n signal.value.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function mouseToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createMouseEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n"],"names":["createMouseEmitter","options","processer","domEventSignal","signal","e","phase","button","toSinglePointerButton","createSinglePointerEmitter","mouseToSinglePointer","source","createStream","observer","emitter","unsub","event","pointer","err"],"mappings":"kMAeO,SAASA,EACdC,EAAuC,GACW,CAClD,SAASC,EACPC,EACAC,EACM,CACN,MAAMC,EAAIF,EAAe,MACzB,IAAIG,EACAC,EACJ,OAAQF,EAAE,KAAA,CACR,IAAK,YACHC,EAAQ,QACRC,EAASC,EAAAA,sBAAsBH,EAAE,MAAM,EACvC,MACF,IAAK,UACHC,EAAQ,MACRC,EAASC,EAAAA,sBAAsBH,EAAE,MAAM,EACvC,MACF,QACEC,EAAQ,OACRC,EAAS,MAAA,CAGbH,EAAO,MAAM,GAAK,GAClBA,EAAO,MAAM,MAAQE,EACrBF,EAAO,MAAM,EAAIC,EAAE,QACnBD,EAAO,MAAM,EAAIC,EAAE,QACnBD,EAAO,MAAM,MAAQC,EAAE,MACvBD,EAAO,MAAM,MAAQC,EAAE,MACvBD,EAAO,MAAM,YAAc,QAC3BA,EAAO,MAAM,OAASG,EACtBH,EAAO,MAAM,SAAWE,IAAU,QAAUD,EAAE,UAAY,EAAI,EAAI,EACpE,CAEA,OAAOI,EAAAA,2BAA2BP,EAAWD,CAAO,CACtD,CAEO,SAASS,EACdT,EAAuC,GACoB,CAC3D,OAAQU,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAUd,EAAmBC,CAAO,EAEpCc,EAAQJ,EAAO,UAAU,CAC7B,KAAKK,EAAO,CACV,MAAMC,EAAUH,EAAQ,QAAQE,CAAK,EACrCH,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,EAAQ,QAAA,CACV,CACF,CAAC,CACL"}
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 {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = \"mouse\";\n signal.value.button = button;\n signal.value.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerRecognizerOptions = {},\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","e","phase","button","toSinglePointerButton","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":"qMAeO,SAASA,EACdC,EAA0C,GACW,CACrD,SAASC,EACPC,EACAC,EACM,CACN,MAAMC,EAAIF,EAAe,MACzB,IAAIG,EACAC,EACJ,OAAQF,EAAE,KAAA,CACR,IAAK,YACHC,EAAQ,QACRC,EAASC,EAAAA,sBAAsBH,EAAE,MAAM,EACvC,MACF,IAAK,UACHC,EAAQ,MACRC,EAASC,EAAAA,sBAAsBH,EAAE,MAAM,EACvC,MACF,QACEC,EAAQ,OACRC,EAAS,MAAA,CAGbH,EAAO,MAAM,GAAK,GAClBA,EAAO,MAAM,MAAQE,EACrBF,EAAO,MAAM,EAAIC,EAAE,QACnBD,EAAO,MAAM,EAAIC,EAAE,QACnBD,EAAO,MAAM,MAAQC,EAAE,MACvBD,EAAO,MAAM,MAAQC,EAAE,MACvBD,EAAO,MAAM,YAAc,QAC3BA,EAAO,MAAM,OAASG,EACtBH,EAAO,MAAM,SAAWE,IAAU,QAAUD,EAAE,UAAY,EAAI,EAAI,EACpE,CAEA,OAAOI,EAAAA,8BAA8BP,EAAWD,CAAO,CACzD,CAEO,SAASS,EACdT,EAA0C,GACiB,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,36 +1,36 @@
1
- import { c as s } from "../stream-CDK0RZPi.js";
2
- import { c as p } from "../emitter-FFAuyJ19.js";
3
- import { t as c } from "../types-Ccnqx90M.js";
4
- function m(n = {}) {
5
- function a(u, e) {
6
- const t = u.value;
1
+ import { c as a } from "../stream-CDK0RZPi.js";
2
+ import { c as p } from "../recognizer-FFAuyJ19.js";
3
+ import { t as s } from "../types-Ccnqx90M.js";
4
+ function i(u = {}) {
5
+ function c(n, e) {
6
+ const t = n.value;
7
7
  let o, r;
8
8
  switch (t.type) {
9
9
  case "mousedown":
10
- o = "start", r = c(t.button);
10
+ o = "start", r = s(t.button);
11
11
  break;
12
12
  case "mouseup":
13
- o = "end", r = c(t.button);
13
+ o = "end", r = s(t.button);
14
14
  break;
15
15
  default:
16
16
  o = "move", r = "none";
17
17
  }
18
18
  e.value.id = "", e.value.phase = o, e.value.x = t.clientX, e.value.y = t.clientY, e.value.pageX = t.pageX, e.value.pageY = t.pageY, e.value.pointerType = "mouse", e.value.button = r, e.value.pressure = o === "move" && t.buttons === 0 ? 0 : 0.5;
19
19
  }
20
- return p(a, n);
20
+ return p(c, u);
21
21
  }
22
- function b(n = {}) {
23
- return (a) => s((u) => {
24
- const e = m(n), t = a.subscribe({
22
+ function b(u = {}) {
23
+ return (c) => a((n) => {
24
+ const e = i(u), t = c.subscribe({
25
25
  next(o) {
26
26
  const r = e.process(o);
27
- u.next(r);
27
+ n.next(r);
28
28
  },
29
29
  error(o) {
30
- u.error?.(o);
30
+ n.error?.(o);
31
31
  },
32
32
  complete() {
33
- u.complete?.();
33
+ n.complete?.();
34
34
  }
35
35
  });
36
36
  return () => {
@@ -39,7 +39,7 @@ function b(n = {}) {
39
39
  });
40
40
  }
41
41
  export {
42
- m as createMouseEmitter,
43
- b as singlePointer
42
+ i as createMouseRecognizer,
43
+ b as singlePointerRecognizer
44
44
  };
45
45
  //# sourceMappingURL=mouse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mouse.js","sources":["../../src/browser/single-pointer/mouse-emitter.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 {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = \"mouse\";\n signal.value.button = button;\n signal.value.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function mouseToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createMouseEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n"],"names":["createMouseEmitter","options","processer","domEventSignal","signal","e","phase","button","toSinglePointerButton","createSinglePointerEmitter","mouseToSinglePointer","source","createStream","observer","emitter","unsub","event","pointer","err"],"mappings":";;;AAeO,SAASA,EACdC,IAAuC,IACW;AAClD,WAASC,EACPC,GACAC,GACM;AACN,UAAMC,IAAIF,EAAe;AACzB,QAAIG,GACAC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAC,IAAQ,SACRC,IAASC,EAAsBH,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAC,IAAQ,OACRC,IAASC,EAAsBH,EAAE,MAAM;AACvC;AAAA,MACF;AACE,QAAAC,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,IAAAH,EAAO,MAAM,KAAK,IAClBA,EAAO,MAAM,QAAQE,GACrBF,EAAO,MAAM,IAAIC,EAAE,SACnBD,EAAO,MAAM,IAAIC,EAAE,SACnBD,EAAO,MAAM,QAAQC,EAAE,OACvBD,EAAO,MAAM,QAAQC,EAAE,OACvBD,EAAO,MAAM,cAAc,SAC3BA,EAAO,MAAM,SAASG,GACtBH,EAAO,MAAM,WAAWE,MAAU,UAAUD,EAAE,YAAY,IAAI,IAAI;AAAA,EACpE;AAEA,SAAOI,EAA2BP,GAAWD,CAAO;AACtD;AAEO,SAASS,EACdT,IAAuC,IACoB;AAC3D,SAAO,CAACU,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAUd,EAAmBC,CAAO,GAEpCc,IAAQJ,EAAO,UAAU;AAAA,MAC7B,KAAKK,GAAO;AACV,cAAMC,IAAUH,EAAQ,QAAQE,CAAK;AACrC,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,EAAQ,QAAA;AAAA,IACV;AAAA,EACF,CAAC;AACL;"}
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 {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport {\n type SinglePointerButton,\n type SinglePointerPhase,\n toSinglePointerButton,\n} from \"./types.js\";\n\nexport function createMouseRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.phase = phase;\n signal.value.x = e.clientX;\n signal.value.y = e.clientY;\n signal.value.pageX = e.pageX;\n signal.value.pageY = e.pageY;\n signal.value.pointerType = \"mouse\";\n signal.value.button = button;\n signal.value.pressure = phase === \"move\" && e.buttons === 0 ? 0 : 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromMouse(\n options: SinglePointerRecognizerOptions = {},\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","e","phase","button","toSinglePointerButton","createSinglePointerRecognizer","singlePointerFromMouse","source","createStream","observer","recognizer","unsub","event","pointer","err"],"mappings":";;;AAeO,SAASA,EACdC,IAA0C,IACW;AACrD,WAASC,EACPC,GACAC,GACM;AACN,UAAMC,IAAIF,EAAe;AACzB,QAAIG,GACAC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAC,IAAQ,SACRC,IAASC,EAAsBH,EAAE,MAAM;AACvC;AAAA,MACF,KAAK;AACH,QAAAC,IAAQ,OACRC,IAASC,EAAsBH,EAAE,MAAM;AACvC;AAAA,MACF;AACE,QAAAC,IAAQ,QACRC,IAAS;AAAA,IAAA;AAGb,IAAAH,EAAO,MAAM,KAAK,IAClBA,EAAO,MAAM,QAAQE,GACrBF,EAAO,MAAM,IAAIC,EAAE,SACnBD,EAAO,MAAM,IAAIC,EAAE,SACnBD,EAAO,MAAM,QAAQC,EAAE,OACvBD,EAAO,MAAM,QAAQC,EAAE,OACvBD,EAAO,MAAM,cAAc,SAC3BA,EAAO,MAAM,SAASG,GACtBH,EAAO,MAAM,WAAWE,MAAU,UAAUD,EAAE,YAAY,IAAI,IAAI;AAAA,EACpE;AAEA,SAAOI,EAA8BP,GAAWD,CAAO;AACzD;AAEO,SAASS,EACdT,IAA0C,IACiB;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";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../stream-Cp6eCZs2.cjs"),i=require("../emitter-CyT5OiQO.cjs");function a(u={}){function n(c,e){const o=c.value,t=o.touches[0]??o.changedTouches[0];if(!t)return;let r;switch(o.type){case"touchstart":r="start";break;case"touchend":r="end";break;case"touchcancel":r="cancel";break;default:r="move"}e.value.phase=r,e.value.x=t.clientX,e.value.y=t.clientY,e.value.pageX=t.pageX,e.value.pageY=t.pageY,e.value.pointerType="touch",e.value.button="none",e.value.pressure=t.force||.5}return i.createSinglePointerEmitter(n,u)}function p(u={}){return n=>s.createStream(c=>{const e=a(u),o=n.subscribe({next(t){const r=e.process(t);r&&c.next(r)},error(t){c.error?.(t)},complete(){c.complete?.()}});return()=>{o(),e.dispose()}})}exports.createTouchEmitter=a;exports.singlePointer=p;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("../stream-Cp6eCZs2.cjs"),i=require("../recognizer-BrqdN-1T.cjs");function a(n={}){function u(c,e){const o=c.value,t=o.touches[0]??o.changedTouches[0];if(!t)return;let r;switch(o.type){case"touchstart":r="start";break;case"touchend":r="end";break;case"touchcancel":r="cancel";break;default:r="move"}e.value.phase=r,e.value.x=t.clientX,e.value.y=t.clientY,e.value.pageX=t.pageX,e.value.pageY=t.pageY,e.value.pointerType="touch",e.value.button="none",e.value.pressure=t.force||.5}return i.createSinglePointerRecognizer(u,n)}function p(n={}){return u=>s.createStream(c=>{const e=a(n),o=u.subscribe({next(t){const r=e.process(t);r&&c.next(r)},error(t){c.error?.(t)},complete(){c.complete?.()}});return()=>{o(),e.dispose()}})}exports.createTouchRecognizer=a;exports.singlePointerRecognizer=p;
2
2
  //# sourceMappingURL=touch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"touch.cjs","sources":["../../src/browser/single-pointer/touch-emitter.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 {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.x = touch.clientX;\n signal.value.y = touch.clientY;\n signal.value.pageX = touch.pageX;\n signal.value.pageY = touch.pageY;\n signal.value.pointerType = \"touch\";\n signal.value.button = \"none\";\n signal.value.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function touchToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createTouchEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n"],"names":["createTouchEmitter","options","processer","event","signal","e","touch","phase","createSinglePointerEmitter","touchToSinglePointer","source","createStream","observer","emitter","unsub","pointer","err"],"mappings":"+JAWO,SAASA,EACdC,EAAuC,GACW,CAClD,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,CAGZH,EAAO,MAAM,MAAQG,EACrBH,EAAO,MAAM,EAAIE,EAAM,QACvBF,EAAO,MAAM,EAAIE,EAAM,QACvBF,EAAO,MAAM,MAAQE,EAAM,MAC3BF,EAAO,MAAM,MAAQE,EAAM,MAC3BF,EAAO,MAAM,YAAc,QAC3BA,EAAO,MAAM,OAAS,OACtBA,EAAO,MAAM,SAAWE,EAAM,OAAS,EACzC,CAEA,OAAOE,EAAAA,2BAA2BN,EAAWD,CAAO,CACtD,CAEO,SAASQ,EACdR,EAAuC,GACoB,CAC3D,OAAQS,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAUb,EAAmBC,CAAO,EAEpCa,EAAQJ,EAAO,UAAU,CAC7B,KAAKP,EAAO,CACV,MAAMY,EAAUF,EAAQ,QAAQV,CAAK,EACjCY,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,EAAQ,QAAA,CACV,CACF,CAAC,CACL"}
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 {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.x = touch.clientX;\n signal.value.y = touch.clientY;\n signal.value.pageX = touch.pageX;\n signal.value.pageY = touch.pageY;\n signal.value.pointerType = \"touch\";\n signal.value.button = \"none\";\n signal.value.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerRecognizerOptions = {},\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","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":"kKAWO,SAASA,EACdC,EAA0C,GACW,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,CAGZH,EAAO,MAAM,MAAQG,EACrBH,EAAO,MAAM,EAAIE,EAAM,QACvBF,EAAO,MAAM,EAAIE,EAAM,QACvBF,EAAO,MAAM,MAAQE,EAAM,MAC3BF,EAAO,MAAM,MAAQE,EAAM,MAC3BF,EAAO,MAAM,YAAc,QAC3BA,EAAO,MAAM,OAAS,OACtBA,EAAO,MAAM,SAAWE,EAAM,OAAS,EACzC,CAEA,OAAOE,EAAAA,8BAA8BN,EAAWD,CAAO,CACzD,CAEO,SAASQ,EACdR,EAA0C,GACiB,CAC3D,OAAQS,GACNC,eAAcC,GAAa,CACzB,MAAMC,EAAab,EAAsBC,CAAO,EAE1Ca,EAAQJ,EAAO,UAAU,CAC7B,KAAKP,EAAO,CACV,MAAMY,EAAUF,EAAW,QAAQV,CAAK,EACpCY,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"}
@@ -1,7 +1,7 @@
1
1
  import { c as a } from "../stream-CDK0RZPi.js";
2
- import { c as s } from "../emitter-FFAuyJ19.js";
3
- function p(u = {}) {
4
- function n(r, e) {
2
+ import { c as s } from "../recognizer-FFAuyJ19.js";
3
+ function p(n = {}) {
4
+ function u(r, e) {
5
5
  const o = r.value, t = o.touches[0] ?? o.changedTouches[0];
6
6
  if (!t)
7
7
  return;
@@ -21,11 +21,11 @@ function p(u = {}) {
21
21
  }
22
22
  e.value.phase = c, e.value.x = t.clientX, e.value.y = t.clientY, e.value.pageX = t.pageX, e.value.pageY = t.pageY, e.value.pointerType = "touch", e.value.button = "none", e.value.pressure = t.force || 0.5;
23
23
  }
24
- return s(n, u);
24
+ return s(u, n);
25
25
  }
26
- function l(u = {}) {
27
- return (n) => a((r) => {
28
- const e = p(u), o = n.subscribe({
26
+ function l(n = {}) {
27
+ return (u) => a((r) => {
28
+ const e = p(n), o = u.subscribe({
29
29
  next(t) {
30
30
  const c = e.process(t);
31
31
  c && r.next(c);
@@ -43,7 +43,7 @@ function l(u = {}) {
43
43
  });
44
44
  }
45
45
  export {
46
- p as createTouchEmitter,
47
- l as singlePointer
46
+ p as createTouchRecognizer,
47
+ l as singlePointerRecognizer
48
48
  };
49
49
  //# sourceMappingURL=touch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"touch.js","sources":["../../src/browser/single-pointer/touch-emitter.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 {\n createSinglePointerEmitter,\n type SinglePointerEmitter,\n type SinglePointerEmitterOptions,\n} from \"./emitter.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchEmitter(\n options: SinglePointerEmitterOptions = {},\n): SinglePointerEmitter<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 signal.value.x = touch.clientX;\n signal.value.y = touch.clientY;\n signal.value.pageX = touch.pageX;\n signal.value.pageY = touch.pageY;\n signal.value.pointerType = \"touch\";\n signal.value.button = \"none\";\n signal.value.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerEmitter(processer, options);\n}\n\nexport function touchToSinglePointer(\n options: SinglePointerEmitterOptions = {},\n): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal> {\n return (source) =>\n createStream((observer) => {\n const emitter = createTouchEmitter(options);\n\n const unsub = source.subscribe({\n next(event) {\n const pointer = emitter.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 emitter.dispose();\n };\n });\n}\n"],"names":["createTouchEmitter","options","processer","event","signal","e","touch","phase","createSinglePointerEmitter","touchToSinglePointer","source","createStream","observer","emitter","unsub","pointer","err"],"mappings":";;AAWO,SAASA,EACdC,IAAuC,IACW;AAClD,WAASC,EAAUC,GAAmCC,GAAmC;AACvF,UAAMC,IAAIF,EAAM,OACVG,IAAQD,EAAE,QAAQ,CAAC,KAAKA,EAAE,eAAe,CAAC;AAChD,QAAI,CAACC;AACH;AAGF,QAAIC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAE,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF;AACE,QAAAA,IAAQ;AAAA,IAAA;AAGZ,IAAAH,EAAO,MAAM,QAAQG,GACrBH,EAAO,MAAM,IAAIE,EAAM,SACvBF,EAAO,MAAM,IAAIE,EAAM,SACvBF,EAAO,MAAM,QAAQE,EAAM,OAC3BF,EAAO,MAAM,QAAQE,EAAM,OAC3BF,EAAO,MAAM,cAAc,SAC3BA,EAAO,MAAM,SAAS,QACtBA,EAAO,MAAM,WAAWE,EAAM,SAAS;AAAA,EACzC;AAEA,SAAOE,EAA2BN,GAAWD,CAAO;AACtD;AAEO,SAASQ,EACdR,IAAuC,IACoB;AAC3D,SAAO,CAACS,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAUb,EAAmBC,CAAO,GAEpCa,IAAQJ,EAAO,UAAU;AAAA,MAC7B,KAAKP,GAAO;AACV,cAAMY,IAAUF,EAAQ,QAAQV,CAAK;AACrC,QAAIY,KACFH,EAAS,KAAKG,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAJ,EAAS,QAAQI,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAJ,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAQ,QAAA;AAAA,IACV;AAAA,EACF,CAAC;AACL;"}
1
+ {"version":3,"file":"touch.js","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 {\n createSinglePointerRecognizer,\n type SinglePointerRecognizer,\n type SinglePointerRecognizerOptions,\n} from \"./recognizer.js\";\nimport type { SinglePointerSignal } from \"./single-pointer-signal.js\";\nimport type { SinglePointerPhase } from \"./types.js\";\n\nexport function createTouchRecognizer(\n options: SinglePointerRecognizerOptions = {},\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 signal.value.x = touch.clientX;\n signal.value.y = touch.clientY;\n signal.value.pageX = touch.pageX;\n signal.value.pageY = touch.pageY;\n signal.value.pointerType = \"touch\";\n signal.value.button = \"none\";\n signal.value.pressure = touch.force || 0.5;\n }\n\n return createSinglePointerRecognizer(processer, options);\n}\n\nexport function singlePointerFromTouch(\n options: SinglePointerRecognizerOptions = {},\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","createSinglePointerRecognizer","singlePointerFromTouch","source","createStream","observer","recognizer","unsub","pointer","err"],"mappings":";;AAWO,SAASA,EACdC,IAA0C,IACW;AACrD,WAASC,EAAUC,GAAmCC,GAAmC;AACvF,UAAMC,IAAIF,EAAM,OACVG,IAAQD,EAAE,QAAQ,CAAC,KAAKA,EAAE,eAAe,CAAC;AAChD,QAAI,CAACC;AACH;AAGF,QAAIC;AACJ,YAAQF,EAAE,MAAA;AAAA,MACR,KAAK;AACH,QAAAE,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF,KAAK;AACH,QAAAA,IAAQ;AACR;AAAA,MACF;AACE,QAAAA,IAAQ;AAAA,IAAA;AAGZ,IAAAH,EAAO,MAAM,QAAQG,GACrBH,EAAO,MAAM,IAAIE,EAAM,SACvBF,EAAO,MAAM,IAAIE,EAAM,SACvBF,EAAO,MAAM,QAAQE,EAAM,OAC3BF,EAAO,MAAM,QAAQE,EAAM,OAC3BF,EAAO,MAAM,cAAc,SAC3BA,EAAO,MAAM,SAAS,QACtBA,EAAO,MAAM,WAAWE,EAAM,SAAS;AAAA,EACzC;AAEA,SAAOE,EAA8BN,GAAWD,CAAO;AACzD;AAEO,SAASQ,EACdR,IAA0C,IACiB;AAC3D,SAAO,CAACS,MACNC,EAAa,CAACC,MAAa;AACzB,UAAMC,IAAab,EAAsBC,CAAO,GAE1Ca,IAAQJ,EAAO,UAAU;AAAA,MAC7B,KAAKP,GAAO;AACV,cAAMY,IAAUF,EAAW,QAAQV,CAAK;AACxC,QAAIY,KACFH,EAAS,KAAKG,CAAO;AAAA,MAEzB;AAAA,MACA,MAAMC,GAAK;AACT,QAAAJ,EAAS,QAAQI,CAAG;AAAA,MACtB;AAAA,MACA,WAAW;AACT,QAAAJ,EAAS,WAAA;AAAA,MACX;AAAA,IAAA,CACD;AAED,WAAO,MAAM;AACX,MAAAE,EAAA,GACAD,EAAW,QAAA;AAAA,IACb;AAAA,EACF,CAAC;AACL;"}
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.3.0",
4
+ "version": "0.3.1",
5
5
  "license": "MIT",
6
6
  "author": "devphilip21 <philip21.dev@gmail.com>",
7
7
  "repository": {
@@ -1,13 +0,0 @@
1
- import { Signal } from '../../core/signal.js';
2
- import { SinglePointerSignal } from './single-pointer-signal.js';
3
- export interface SinglePointerEmitter<InputSignal extends Signal> {
4
- process(event: InputSignal): SinglePointerSignal;
5
- readonly isActive: boolean;
6
- reset(): void;
7
- dispose(): void;
8
- }
9
- export interface SinglePointerEmitterOptions {
10
- pooling?: boolean;
11
- }
12
- export declare function createSinglePointerEmitter<InputSignal extends Signal>(processor: (inputSignal: InputSignal, pointerSignal: SinglePointerSignal) => void, options?: SinglePointerEmitterOptions): SinglePointerEmitter<InputSignal>;
13
- //# sourceMappingURL=emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,MAAM,WAAW,oBAAoB,CAAC,WAAW,SAAS,MAAM;IAC9D,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CAAC,WAAW,SAAS,MAAM,EACnE,SAAS,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,KAAK,IAAI,EACjF,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,CAAC,WAAW,CAAC,CA8CnC"}
@@ -1,7 +0,0 @@
1
- import { Operator } from '../../core/stream.js';
2
- import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
- import { SinglePointerEmitter, SinglePointerEmitterOptions } from './emitter.js';
4
- import { SinglePointerSignal } from './single-pointer-signal.js';
5
- export declare function createMouseEmitter(options?: SinglePointerEmitterOptions): SinglePointerEmitter<DomEventSignal<MouseEvent>>;
6
- export declare function mouseToSinglePointer(options?: SinglePointerEmitterOptions): Operator<DomEventSignal<MouseEvent>, SinglePointerSignal>;
7
- //# sourceMappingURL=mouse-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mouse-emitter.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/mouse-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkClD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAuB3D"}
@@ -1,8 +0,0 @@
1
- import { Operator, Stream } from '../../core/stream.js';
2
- import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
- import { SinglePointerEmitter, SinglePointerEmitterOptions } from './emitter.js';
4
- import { SinglePointerSignal } from './single-pointer-signal.js';
5
- export declare function createPointerEmitter(options?: SinglePointerEmitterOptions): SinglePointerEmitter<DomEventSignal<PointerEvent>>;
6
- export declare function pointerToSinglePointer(options?: SinglePointerEmitterOptions): Operator<DomEventSignal<PointerEvent>, SinglePointerSignal>;
7
- export declare function singlePointer(target: EventTarget): Stream<SinglePointerSignal>;
8
- //# sourceMappingURL=pointer-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pointer-emitter.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/pointer-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAQtE,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CA2CpD;AAED,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,2BAAgC,GACxC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC,CAyB7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAG9E"}
@@ -1,7 +0,0 @@
1
- import { Operator } from '../../core/stream.js';
2
- import { DomEventSignal } from '../dom-event/dom-event-signal.js';
3
- import { SinglePointerEmitter, SinglePointerEmitterOptions } from './emitter.js';
4
- import { SinglePointerSignal } from './single-pointer-signal.js';
5
- export declare function createTouchEmitter(options?: SinglePointerEmitterOptions): SinglePointerEmitter<DomEventSignal<TouchEvent>>;
6
- export declare function touchToSinglePointer(options?: SinglePointerEmitterOptions): Operator<DomEventSignal<TouchEvent>, SinglePointerSignal>;
7
- //# sourceMappingURL=touch-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"touch-emitter.d.ts","sourceRoot":"","sources":["../../../src/browser/single-pointer/touch-emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,2BAAgC,GACxC,oBAAoB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAkClD;AAED,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,2BAAgC,GACxC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC,CAyB3D"}
@@ -1 +0,0 @@
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 +0,0 @@
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;"}