@vielzeug/flux 1.0.8 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +22 -25
  2. package/dist/_dev.cjs +1 -1
  3. package/dist/_dev.cjs.map +1 -1
  4. package/dist/_dev.js +2 -8
  5. package/dist/_dev.js.map +1 -1
  6. package/dist/_iterator.cjs +1 -1
  7. package/dist/_iterator.cjs.map +1 -1
  8. package/dist/_iterator.d.ts +3 -1
  9. package/dist/_iterator.d.ts.map +1 -1
  10. package/dist/_iterator.js +57 -35
  11. package/dist/_iterator.js.map +1 -1
  12. package/dist/_link.cjs +2 -0
  13. package/dist/_link.cjs.map +1 -0
  14. package/dist/_link.d.ts +4 -0
  15. package/dist/_link.d.ts.map +1 -0
  16. package/dist/_link.js +8 -0
  17. package/dist/_link.js.map +1 -0
  18. package/dist/_numeric.cjs +1 -1
  19. package/dist/_numeric.cjs.map +1 -1
  20. package/dist/_numeric.d.ts +2 -1
  21. package/dist/_numeric.d.ts.map +1 -1
  22. package/dist/_numeric.js +3 -7
  23. package/dist/_numeric.js.map +1 -1
  24. package/dist/_pipe.cjs +1 -1
  25. package/dist/_pipe.cjs.map +1 -1
  26. package/dist/_pipe.d.ts +2 -1
  27. package/dist/_pipe.d.ts.map +1 -1
  28. package/dist/_pipe.js +3 -3
  29. package/dist/_pipe.js.map +1 -1
  30. package/dist/_safe.cjs +1 -1
  31. package/dist/_safe.cjs.map +1 -1
  32. package/dist/_safe.d.ts +1 -1
  33. package/dist/_safe.d.ts.map +1 -1
  34. package/dist/_safe.js +2 -2
  35. package/dist/_safe.js.map +1 -1
  36. package/dist/_scheduler.cjs +1 -1
  37. package/dist/_scheduler.cjs.map +1 -1
  38. package/dist/_scheduler.d.ts +5 -2
  39. package/dist/_scheduler.d.ts.map +1 -1
  40. package/dist/_scheduler.js +1 -1
  41. package/dist/_scheduler.js.map +1 -1
  42. package/dist/_subscription.cjs +2 -0
  43. package/dist/_subscription.cjs.map +1 -0
  44. package/dist/_subscription.d.ts +8 -0
  45. package/dist/_subscription.d.ts.map +1 -0
  46. package/dist/_subscription.js +80 -0
  47. package/dist/_subscription.js.map +1 -0
  48. package/dist/adapters/courier.cjs +1 -1
  49. package/dist/adapters/courier.cjs.map +1 -1
  50. package/dist/adapters/courier.d.ts +35 -21
  51. package/dist/adapters/courier.d.ts.map +1 -1
  52. package/dist/adapters/courier.js +25 -6
  53. package/dist/adapters/courier.js.map +1 -1
  54. package/dist/adapters/herald.cjs +1 -1
  55. package/dist/adapters/herald.cjs.map +1 -1
  56. package/dist/adapters/herald.d.ts +2 -16
  57. package/dist/adapters/herald.d.ts.map +1 -1
  58. package/dist/adapters/herald.js +12 -8
  59. package/dist/adapters/herald.js.map +1 -1
  60. package/dist/adapters/pulse.cjs +1 -1
  61. package/dist/adapters/pulse.cjs.map +1 -1
  62. package/dist/adapters/pulse.d.ts +3 -20
  63. package/dist/adapters/pulse.d.ts.map +1 -1
  64. package/dist/adapters/pulse.js +2 -6
  65. package/dist/adapters/pulse.js.map +1 -1
  66. package/dist/adapters/ripple.cjs +1 -1
  67. package/dist/adapters/ripple.cjs.map +1 -1
  68. package/dist/adapters/ripple.d.ts +3 -39
  69. package/dist/adapters/ripple.d.ts.map +1 -1
  70. package/dist/adapters/ripple.js +22 -29
  71. package/dist/adapters/ripple.js.map +1 -1
  72. package/dist/async.cjs +2 -0
  73. package/dist/async.cjs.map +1 -0
  74. package/dist/async.d.ts +4 -0
  75. package/dist/async.d.ts.map +1 -0
  76. package/dist/async.js +11 -0
  77. package/dist/async.js.map +1 -0
  78. package/dist/core.cjs +1 -1
  79. package/dist/core.cjs.map +1 -1
  80. package/dist/core.d.ts +3 -16
  81. package/dist/core.d.ts.map +1 -1
  82. package/dist/core.js +12 -81
  83. package/dist/core.js.map +1 -1
  84. package/dist/courier.cjs +1 -0
  85. package/dist/courier.d.ts +2 -0
  86. package/dist/courier.d.ts.map +1 -0
  87. package/dist/courier.js +2 -0
  88. package/dist/errors.cjs.map +1 -1
  89. package/dist/errors.js.map +1 -1
  90. package/dist/flux.cjs +1 -1
  91. package/dist/flux.cjs.map +1 -1
  92. package/dist/flux.iife.js +1 -1
  93. package/dist/flux.iife.js.map +1 -1
  94. package/dist/flux.js +1 -1
  95. package/dist/flux.js.map +1 -1
  96. package/dist/herald.cjs +1 -0
  97. package/dist/herald.d.ts +2 -0
  98. package/dist/herald.d.ts.map +1 -0
  99. package/dist/herald.js +2 -0
  100. package/dist/index.cjs +1 -1
  101. package/dist/index.d.ts +13 -15
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +10 -14
  104. package/dist/operators/combination.cjs +1 -1
  105. package/dist/operators/combination.cjs.map +1 -1
  106. package/dist/operators/combination.d.ts +9 -64
  107. package/dist/operators/combination.d.ts.map +1 -1
  108. package/dist/operators/combination.js +46 -160
  109. package/dist/operators/combination.js.map +1 -1
  110. package/dist/operators/creation.cjs +1 -1
  111. package/dist/operators/creation.cjs.map +1 -1
  112. package/dist/operators/creation.d.ts +13 -46
  113. package/dist/operators/creation.d.ts.map +1 -1
  114. package/dist/operators/creation.js +61 -65
  115. package/dist/operators/creation.js.map +1 -1
  116. package/dist/operators/filtering.cjs +1 -1
  117. package/dist/operators/filtering.cjs.map +1 -1
  118. package/dist/operators/filtering.d.ts +10 -60
  119. package/dist/operators/filtering.d.ts.map +1 -1
  120. package/dist/operators/filtering.js +62 -109
  121. package/dist/operators/filtering.js.map +1 -1
  122. package/dist/operators/transformation.cjs +1 -1
  123. package/dist/operators/transformation.cjs.map +1 -1
  124. package/dist/operators/transformation.d.ts +9 -62
  125. package/dist/operators/transformation.d.ts.map +1 -1
  126. package/dist/operators/transformation.js +91 -142
  127. package/dist/operators/transformation.js.map +1 -1
  128. package/dist/operators/utility.cjs +1 -1
  129. package/dist/operators/utility.cjs.map +1 -1
  130. package/dist/operators/utility.d.ts +16 -97
  131. package/dist/operators/utility.d.ts.map +1 -1
  132. package/dist/operators/utility.js +75 -191
  133. package/dist/operators/utility.js.map +1 -1
  134. package/dist/pipe.cjs +2 -0
  135. package/dist/pipe.cjs.map +1 -0
  136. package/dist/pipe.d.ts +15 -0
  137. package/dist/pipe.d.ts.map +1 -0
  138. package/dist/pipe.js +9 -0
  139. package/dist/pipe.js.map +1 -0
  140. package/dist/pulse.cjs +1 -0
  141. package/dist/pulse.d.ts +2 -0
  142. package/dist/pulse.d.ts.map +1 -0
  143. package/dist/pulse.js +2 -0
  144. package/dist/ripple.cjs +1 -0
  145. package/dist/ripple.d.ts +3 -0
  146. package/dist/ripple.d.ts.map +1 -0
  147. package/dist/ripple.js +2 -0
  148. package/dist/subject.cjs +1 -1
  149. package/dist/subject.cjs.map +1 -1
  150. package/dist/subject.d.ts +14 -65
  151. package/dist/subject.d.ts.map +1 -1
  152. package/dist/subject.js +31 -166
  153. package/dist/subject.js.map +1 -1
  154. package/dist/subjects.cjs +1 -0
  155. package/dist/subjects.d.ts +3 -0
  156. package/dist/subjects.d.ts.map +1 -0
  157. package/dist/subjects.js +2 -0
  158. package/dist/types.d.ts +32 -79
  159. package/dist/types.d.ts.map +1 -1
  160. package/package.json +52 -13
@@ -1,90 +1,86 @@
1
- import { flux as e } from "../core.js";
2
- import { DEFAULT_SCHEDULER as t } from "../_scheduler.js";
1
+ import { stream as e } from "../core.js";
2
+ import { defaultScheduler as t } from "../_scheduler.js";
3
3
  //#region src/operators/creation.ts
4
- function n(...t) {
4
+ function n(e, t) {
5
+ if (!Number.isFinite(e) || e < 0) throw RangeError(`${t} must be a finite number greater than or equal to zero`);
6
+ }
7
+ function r(...t) {
5
8
  return e((e) => {
6
9
  for (let n of t) e.next(n);
7
- e.complete?.();
10
+ e.complete();
8
11
  });
9
12
  }
10
- function r(t) {
11
- if (t instanceof Promise) return e((e) => {
12
- let n = !1;
13
- return t.then((t) => {
14
- n || (e.next(t), e.complete?.());
15
- }).catch((t) => {
16
- n || e.error?.(t);
17
- }), () => {
18
- n = !0;
19
- };
20
- });
21
- if (Symbol.asyncIterator in t) {
22
- let n = t;
23
- return e((e) => {
24
- let t = !1, r = n[Symbol.asyncIterator]();
25
- return (async () => {
26
- try {
27
- for (;;) {
28
- let { done: n, value: i } = await r.next();
29
- if (t || n) break;
30
- e.next(i);
13
+ function i(t) {
14
+ return Symbol.asyncIterator in Object(t) ? e((e, n) => {
15
+ let r = t[Symbol.asyncIterator]();
16
+ return (async () => {
17
+ try {
18
+ for (; !n.aborted;) {
19
+ let t = await r.next();
20
+ if (t.done) {
21
+ e.complete();
22
+ return;
31
23
  }
32
- t || e.complete?.();
33
- } catch (n) {
34
- t || e.error?.(n);
24
+ e.next(t.value);
35
25
  }
36
- })(), () => {
37
- t = !0, r.return?.();
38
- };
26
+ } catch (t) {
27
+ n.aborted || e.error(t);
28
+ }
29
+ })(), () => {
30
+ r.return?.();
31
+ };
32
+ }) : typeof t.then == "function" ? e((e, n) => {
33
+ t.then((t) => {
34
+ n.aborted || (e.next(t), e.complete());
35
+ }, (t) => {
36
+ n.aborted || e.error(t);
39
37
  });
40
- }
41
- let n = t;
42
- return e((e) => {
38
+ }) : e((e, n) => {
39
+ let r = t[Symbol.iterator]();
43
40
  try {
44
- for (let t of n) e.next(t);
45
- e.complete?.();
41
+ for (; !n.aborted;) {
42
+ let t = r.next();
43
+ if (t.done) {
44
+ e.complete();
45
+ return;
46
+ }
47
+ e.next(t.value);
48
+ }
46
49
  } catch (t) {
47
- e.error?.(t);
50
+ e.error(t);
48
51
  }
49
- });
50
- }
51
- function i(n, r = t) {
52
- return e((e) => {
53
- let t = 0;
54
- return r.repeat(() => e.next(t++), n);
55
- });
56
- }
57
- function a(n, r, i = t) {
58
- return e((e) => {
59
- let t = 0, a, o = i.delay(() => {
60
- e.next(t++), r === void 0 ? e.complete?.() : a = i.repeat(() => e.next(t++), r);
61
- }, n);
62
52
  return () => {
63
- o(), a?.();
53
+ r.return?.();
64
54
  };
65
55
  });
66
56
  }
67
- function o() {
57
+ function a(t, n) {
68
58
  return e((e) => {
69
- e.complete?.();
59
+ let r = (t) => e.next(t);
60
+ return t.addEventListener(n, r), () => t.removeEventListener(n, r);
70
61
  });
71
62
  }
72
- function s() {
73
- return e(() => {});
74
- }
75
- function c(t) {
76
- return e((e) => {
77
- let n = typeof t == "function" ? t() : t;
78
- e.error?.(n);
63
+ function o(r) {
64
+ return n(r.every, "Interval duration"), e((e) => {
65
+ let n = 0;
66
+ return t.repeat(() => e.next(n++), r.every);
79
67
  });
80
68
  }
81
- function l(t, n) {
82
- return e((e) => {
83
- let r = (t) => e.next(t);
84
- return t.addEventListener(n, r), () => t.removeEventListener(n, r);
69
+ function s(r) {
70
+ return n(r.delay, "Timer delay"), r.interval !== void 0 && n(r.interval, "Timer interval"), e((e) => {
71
+ let n = 0, i, a = t.delay(() => {
72
+ if (e.next(n++), r.interval === void 0) {
73
+ e.complete();
74
+ return;
75
+ }
76
+ i = t.repeat(() => e.next(n++), r.interval);
77
+ }, r.delay);
78
+ return () => {
79
+ a(), i?.();
80
+ };
85
81
  });
86
82
  }
87
83
  //#endregion
88
- export { o as empty, r as from, l as fromEvent, i as interval, s as never, n as of, c as throwError, a as timer };
84
+ export { i as from, a as fromEvent, o as interval, r as of, s as timer };
89
85
 
90
86
  //# sourceMappingURL=creation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"creation.js","names":[],"sources":["../../src/operators/creation.ts"],"sourcesContent":["import type { Flux, Scheduler } from '../types';\n\nimport { DEFAULT_SCHEDULER } from '../_scheduler';\nimport { flux } from '../core';\n\n/**\n * Creates a `Flux` that emits each argument in order, then completes.\n *\n * @example\n * of(1, 2, 3).subscribe(console.log); // 1, 2, 3\n */\nexport function of<T>(...values: T[]): Flux<T> {\n return flux<T>((observer) => {\n for (const v of values) {\n observer.next(v);\n }\n\n observer.complete?.();\n });\n}\n\n/**\n * Converts an `Iterable`, `AsyncIterable`, or `Promise` into a `Flux`.\n *\n * @example\n * from([1, 2, 3]).subscribe(console.log);\n * from(fetch('/api/data').then((r) => r.json())).subscribe(console.log);\n */\nexport function from<T>(source: AsyncIterable<T> | Iterable<T> | Promise<T>): Flux<T> {\n if (source instanceof Promise) {\n return flux<T>((observer) => {\n let cancelled = false;\n\n source\n .then((v) => {\n if (!cancelled) {\n observer.next(v);\n observer.complete?.();\n }\n })\n .catch((err) => {\n if (!cancelled) observer.error?.(err);\n });\n\n return () => {\n cancelled = true;\n };\n });\n }\n\n if (Symbol.asyncIterator in source) {\n const asyncSrc = source as AsyncIterable<T>;\n\n return flux<T>((observer) => {\n let cancelled = false;\n const iter = asyncSrc[Symbol.asyncIterator]();\n\n (async () => {\n try {\n while (true) {\n const { done, value } = await iter.next();\n\n if (cancelled || done) break;\n\n observer.next(value);\n }\n\n if (!cancelled) observer.complete?.();\n } catch (err) {\n if (!cancelled) observer.error?.(err);\n }\n })();\n\n return () => {\n cancelled = true;\n iter.return?.();\n };\n });\n }\n\n const iterSrc = source as Iterable<T>;\n\n return flux<T>((observer) => {\n try {\n for (const v of iterSrc) {\n observer.next(v);\n }\n\n observer.complete?.();\n } catch (err) {\n observer.error?.(err);\n }\n });\n}\n\n/**\n * Emits an incrementing integer (starting at 0) every `ms` milliseconds.\n *\n * @example\n * const ticks = interval(1000); // 0, 1, 2, ... every second\n */\nexport function interval(ms: number, scheduler: Scheduler = DEFAULT_SCHEDULER): Flux<number> {\n return flux<number>((observer) => {\n let i = 0;\n\n return scheduler.repeat(() => observer.next(i++), ms);\n });\n}\n\n/**\n * After an initial `delay` ms, emits `0`, then (if `intervalMs` is provided)\n * emits incrementing values every `intervalMs` ms.\n *\n * @example\n * timer(1000).subscribe(console.log); // emits 0 after 1s, then completes\n * timer(1000, 500).subscribe(console.log); // emits 0 after 1s, then 1, 2, 3... every 500ms\n */\nexport function timer(delay: number, intervalMs?: number, scheduler: Scheduler = DEFAULT_SCHEDULER): Flux<number> {\n return flux<number>((observer) => {\n let count = 0;\n let cancelRepeat: (() => void) | undefined;\n\n const cancelDelay = scheduler.delay(() => {\n observer.next(count++);\n\n if (intervalMs !== undefined) {\n cancelRepeat = scheduler.repeat(() => observer.next(count++), intervalMs);\n } else {\n observer.complete?.();\n }\n }, delay);\n\n return () => {\n cancelDelay();\n cancelRepeat?.();\n };\n });\n}\n\n/** A `Flux` that completes immediately without emitting any values. */\nexport function empty<T = never>(): Flux<T> {\n return flux<T>((observer) => {\n observer.complete?.();\n });\n}\n\n/** A `Flux` that never emits, errors, or completes. */\nexport function never<T = never>(): Flux<T> {\n return flux<T>(() => {});\n}\n\n/** A `Flux` that immediately errors with the given value. */\nexport function throwError<T = never>(errorFactory: (() => unknown) | unknown): Flux<T> {\n return flux<T>((observer) => {\n const err = typeof errorFactory === 'function' ? (errorFactory as () => unknown)() : errorFactory;\n\n observer.error?.(err);\n });\n}\n\n/**\n * Creates a `Flux` from a DOM `EventTarget` or Node.js `EventEmitter`-like\n * object, emitting each time the named event fires.\n *\n * @example\n * fromEvent(document, 'click').subscribe((e) => console.log(e));\n */\nexport function fromEvent<T = Event>(\n target: {\n addEventListener(type: string, listener: (event: T) => void): void;\n removeEventListener(type: string, listener: (event: T) => void): void;\n },\n eventName: string,\n): Flux<T> {\n return flux<T>((observer) => {\n const handler = (event: T): void => observer.next(event);\n\n target.addEventListener(eventName, handler);\n\n return () => target.removeEventListener(eventName, handler);\n });\n}\n"],"mappings":";;;AAWA,SAAgB,EAAM,GAAG,GAAsB;CAC7C,OAAO,GAAS,MAAa;EAC3B,KAAK,IAAM,KAAK,GACd,EAAS,KAAK,CAAC;EAGjB,EAAS,WAAW;CACtB,CAAC;AACH;AASA,SAAgB,EAAQ,GAA8D;CACpF,IAAI,aAAkB,SACpB,OAAO,GAAS,MAAa;EAC3B,IAAI,IAAY;EAahB,OAXA,EACG,MAAM,MAAM;GACX,AAAK,MACH,EAAS,KAAK,CAAC,GACf,EAAS,WAAW;EAExB,CAAC,CAAC,CACD,OAAO,MAAQ;GACd,AAAK,KAAW,EAAS,QAAQ,CAAG;EACtC,CAAC,SAEU;GACX,IAAY;EACd;CACF,CAAC;CAGH,IAAI,OAAO,iBAAiB,GAAQ;EAClC,IAAM,IAAW;EAEjB,OAAO,GAAS,MAAa;GAC3B,IAAI,IAAY,IACV,IAAO,EAAS,OAAO,cAAc,CAAC;GAkB5C,QAhBC,YAAY;IACX,IAAI;KACF,SAAa;MACX,IAAM,EAAE,SAAM,aAAU,MAAM,EAAK,KAAK;MAExC,IAAI,KAAa,GAAM;MAEvB,EAAS,KAAK,CAAK;KACrB;KAEA,AAAK,KAAW,EAAS,WAAW;IACtC,SAAS,GAAK;KACZ,AAAK,KAAW,EAAS,QAAQ,CAAG;IACtC;GACF,EAAA,CAAG,SAEU;IAEX,AADA,IAAY,IACZ,EAAK,SAAS;GAChB;EACF,CAAC;CACH;CAEA,IAAM,IAAU;CAEhB,OAAO,GAAS,MAAa;EAC3B,IAAI;GACF,KAAK,IAAM,KAAK,GACd,EAAS,KAAK,CAAC;GAGjB,EAAS,WAAW;EACtB,SAAS,GAAK;GACZ,EAAS,QAAQ,CAAG;EACtB;CACF,CAAC;AACH;AAQA,SAAgB,EAAS,GAAY,IAAuB,GAAiC;CAC3F,OAAO,GAAc,MAAa;EAChC,IAAI,IAAI;EAER,OAAO,EAAU,aAAa,EAAS,KAAK,GAAG,GAAG,CAAE;CACtD,CAAC;AACH;AAUA,SAAgB,EAAM,GAAe,GAAqB,IAAuB,GAAiC;CAChH,OAAO,GAAc,MAAa;EAChC,IAAI,IAAQ,GACR,GAEE,IAAc,EAAU,YAAY;GAGxC,AAFA,EAAS,KAAK,GAAO,GAEjB,MAAe,KAAA,IAGjB,EAAS,WAAW,IAFpB,IAAe,EAAU,aAAa,EAAS,KAAK,GAAO,GAAG,CAAU;EAI5E,GAAG,CAAK;EAER,aAAa;GAEX,AADA,EAAY,GACZ,IAAe;EACjB;CACF,CAAC;AACH;AAGA,SAAgB,IAA4B;CAC1C,OAAO,GAAS,MAAa;EAC3B,EAAS,WAAW;CACtB,CAAC;AACH;AAGA,SAAgB,IAA4B;CAC1C,OAAO,QAAc,CAAC,CAAC;AACzB;AAGA,SAAgB,EAAsB,GAAkD;CACtF,OAAO,GAAS,MAAa;EAC3B,IAAM,IAAM,OAAO,KAAiB,aAAc,EAA+B,IAAI;EAErF,EAAS,QAAQ,CAAG;CACtB,CAAC;AACH;AASA,SAAgB,EACd,GAIA,GACS;CACT,OAAO,GAAS,MAAa;EAC3B,IAAM,KAAW,MAAmB,EAAS,KAAK,CAAK;EAIvD,OAFA,EAAO,iBAAiB,GAAW,CAAO,SAE7B,EAAO,oBAAoB,GAAW,CAAO;CAC5D,CAAC;AACH"}
1
+ {"version":3,"file":"creation.js","names":[],"sources":["../../src/operators/creation.ts"],"sourcesContent":["import type { Stream } from '../types';\n\nimport { defaultScheduler } from '../_scheduler';\nimport { stream } from '../core';\n\nexport type IntervalOptions = {\n every: number;\n};\n\nexport type TimerOptions = {\n delay: number;\n interval?: number;\n};\n\nfunction assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new RangeError(`${name} must be a finite number greater than or equal to zero`);\n }\n}\n\nexport function of<T>(...values: T[]): Stream<T> {\n return stream((sink) => {\n for (const value of values) sink.next(value);\n sink.complete();\n });\n}\n\nexport function from<T>(source: AsyncIterable<T> | Iterable<T> | Promise<T>): Stream<T> {\n if (Symbol.asyncIterator in Object(source)) {\n return stream((sink, signal) => {\n const iterator = (source as AsyncIterable<T>)[Symbol.asyncIterator]();\n\n void (async () => {\n try {\n while (!signal.aborted) {\n const result = await iterator.next();\n\n if (result.done) {\n sink.complete();\n\n return;\n }\n\n sink.next(result.value);\n }\n } catch (reason) {\n if (!signal.aborted) sink.error(reason);\n }\n })();\n\n return () => {\n void iterator.return?.();\n };\n });\n }\n\n if (typeof (source as Promise<T>).then === 'function') {\n return stream((sink, signal) => {\n void (source as Promise<T>).then(\n (value) => {\n if (!signal.aborted) {\n sink.next(value);\n sink.complete();\n }\n },\n (reason: unknown) => {\n if (!signal.aborted) sink.error(reason);\n },\n );\n });\n }\n\n return stream((sink, signal) => {\n const iterator = (source as Iterable<T>)[Symbol.iterator]();\n\n try {\n while (!signal.aborted) {\n const result = iterator.next();\n\n if (result.done) {\n sink.complete();\n\n return;\n }\n\n sink.next(result.value);\n }\n } catch (reason) {\n sink.error(reason);\n }\n\n return () => {\n iterator.return?.();\n };\n });\n}\n\nexport function fromEvent<T = Event>(\n target: {\n addEventListener(type: string, listener: (event: T) => void): void;\n removeEventListener(type: string, listener: (event: T) => void): void;\n },\n type: string,\n): Stream<T> {\n return stream((sink) => {\n const listener = (event: T): void => sink.next(event);\n\n target.addEventListener(type, listener);\n\n return () => target.removeEventListener(type, listener);\n });\n}\n\nexport function interval(options: IntervalOptions): Stream<number> {\n assertDuration(options.every, 'Interval duration');\n\n return stream((sink) => {\n let index = 0;\n\n return defaultScheduler.repeat(() => sink.next(index++), options.every);\n });\n}\n\nexport function timer(options: TimerOptions): Stream<number> {\n assertDuration(options.delay, 'Timer delay');\n\n if (options.interval !== undefined) assertDuration(options.interval, 'Timer interval');\n\n return stream((sink) => {\n let index = 0;\n let cancelInterval: (() => void) | undefined;\n const cancelDelay = defaultScheduler.delay(() => {\n sink.next(index++);\n\n if (options.interval === undefined) {\n sink.complete();\n\n return;\n }\n\n cancelInterval = defaultScheduler.repeat(() => sink.next(index++), options.interval);\n }, options.delay);\n\n return () => {\n cancelDelay();\n cancelInterval?.();\n };\n });\n}\n"],"mappings":";;;AAcA,SAAS,EAAe,GAAsB,GAAoB;CAChE,IAAI,CAAC,OAAO,SAAS,CAAY,KAAK,IAAe,GACnD,MAAU,WAAW,GAAG,EAAK,uDAAuD;AAExF;AAEA,SAAgB,EAAM,GAAG,GAAwB;CAC/C,OAAO,GAAQ,MAAS;EACtB,KAAK,IAAM,KAAS,GAAQ,EAAK,KAAK,CAAK;EAC3C,EAAK,SAAS;CAChB,CAAC;AACH;AAEA,SAAgB,EAAQ,GAAgE;CA6CtF,OA5CI,OAAO,iBAAiB,OAAO,CAAM,IAChC,GAAQ,GAAM,MAAW;EAC9B,IAAM,IAAY,EAA4B,OAAO,cAAc,CAAC;EAoBpE,QAlBM,YAAY;GAChB,IAAI;IACF,OAAO,CAAC,EAAO,UAAS;KACtB,IAAM,IAAS,MAAM,EAAS,KAAK;KAEnC,IAAI,EAAO,MAAM;MACf,EAAK,SAAS;MAEd;KACF;KAEA,EAAK,KAAK,EAAO,KAAK;IACxB;GACF,SAAS,GAAQ;IACf,AAAK,EAAO,WAAS,EAAK,MAAM,CAAM;GACxC;EACF,EAAA,CAAG,SAEU;GACX,EAAc,SAAS;EACzB;CACF,CAAC,IAGC,OAAQ,EAAsB,QAAS,aAClC,GAAQ,GAAM,MAAW;EAC9B,EAA4B,MACzB,MAAU;GACT,AAAK,EAAO,YACV,EAAK,KAAK,CAAK,GACf,EAAK,SAAS;EAElB,IACC,MAAoB;GACnB,AAAK,EAAO,WAAS,EAAK,MAAM,CAAM;EACxC,CACF;CACF,CAAC,IAGI,GAAQ,GAAM,MAAW;EAC9B,IAAM,IAAY,EAAuB,OAAO,SAAS,CAAC;EAE1D,IAAI;GACF,OAAO,CAAC,EAAO,UAAS;IACtB,IAAM,IAAS,EAAS,KAAK;IAE7B,IAAI,EAAO,MAAM;KACf,EAAK,SAAS;KAEd;IACF;IAEA,EAAK,KAAK,EAAO,KAAK;GACxB;EACF,SAAS,GAAQ;GACf,EAAK,MAAM,CAAM;EACnB;EAEA,aAAa;GACX,EAAS,SAAS;EACpB;CACF,CAAC;AACH;AAEA,SAAgB,EACd,GAIA,GACW;CACX,OAAO,GAAQ,MAAS;EACtB,IAAM,KAAY,MAAmB,EAAK,KAAK,CAAK;EAIpD,OAFA,EAAO,iBAAiB,GAAM,CAAQ,SAEzB,EAAO,oBAAoB,GAAM,CAAQ;CACxD,CAAC;AACH;AAEA,SAAgB,EAAS,GAA0C;CAGjE,OAFA,EAAe,EAAQ,OAAO,mBAAmB,GAE1C,GAAQ,MAAS;EACtB,IAAI,IAAQ;EAEZ,OAAO,EAAiB,aAAa,EAAK,KAAK,GAAO,GAAG,EAAQ,KAAK;CACxE,CAAC;AACH;AAEA,SAAgB,EAAM,GAAuC;CAK3D,OAJA,EAAe,EAAQ,OAAO,aAAa,GAEvC,EAAQ,aAAa,KAAA,KAAW,EAAe,EAAQ,UAAU,gBAAgB,GAE9E,GAAQ,MAAS;EACtB,IAAI,IAAQ,GACR,GACE,IAAc,EAAiB,YAAY;GAG/C,IAFA,EAAK,KAAK,GAAO,GAEb,EAAQ,aAAa,KAAA,GAAW;IAClC,EAAK,SAAS;IAEd;GACF;GAEA,IAAiB,EAAiB,aAAa,EAAK,KAAK,GAAO,GAAG,EAAQ,QAAQ;EACrF,GAAG,EAAQ,KAAK;EAEhB,aAAa;GAEX,AADA,EAAY,GACZ,IAAiB;EACnB;CACF,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- const e=require("../core.cjs"),t=require("../_scheduler.cjs"),n=require("../_safe.cjs");function r(t){return n=>e.flux(e=>{if(t<=0){e.complete?.();return}let r=0,i=()=>{};return i=n.subscribe({complete:e.complete,error:e.error,next(n){e.next(n),r++,r>=t&&(e.complete?.(),i())}}),i})}function i(t){return n=>e.flux(e=>{let r=0;return n.subscribe({complete:e.complete,error:e.error,next(n){r<t?r++:e.next(n)}})})}function a(t){return n=>e.flux(e=>{let r=!1,i=()=>{r||(r=!0,e.complete?.(),a(),o?.())},a;if(t instanceof AbortSignal){if(t.aborted){e.complete?.();return}t.addEventListener(`abort`,i,{once:!0}),a=()=>t.removeEventListener(`abort`,i)}else a=t.subscribe({next:i});let o=n.subscribe({complete(){r=!0,a(),e.complete?.()},error(t){r=!0,a(),e.error?.(t)},next:e.next});return()=>{a(),o()}})}function o(t){return r=>e.flux(e=>{let i=()=>{};return i=r.subscribe({complete:e.complete,error:e.error,next(r){n.guard(()=>{t(r)?e.next(r):(e.complete?.(),i())},e.error)}}),i})}function s(n,r=t.DEFAULT_SCHEDULER){return t=>e.flux(e=>{let i,a=t.subscribe({complete(){i?.(),e.complete?.()},error(t){i?.(),e.error?.(t)},next(t){i?.(),i=r.delay(()=>e.next(t),n)}});return()=>{i?.(),a()}})}function c(t,n=Date.now){return r=>e.flux(e=>{let i=-1/0;return r.subscribe({complete:e.complete,error:e.error,next(r){let a=n();a-i>=t&&(i=a,e.next(r))}})})}function l(t){return n=>e.flux(e=>{let r,i=!1,a=n.subscribe({complete:e.complete,error:e.error,next(e){r=e,i=!0}}),o=t.subscribe({next(){i&&e.next(r)}});return()=>{a(),o()}})}function u(){return r(1)}function d(){return t=>e.flux(e=>{let n,r=!1;return t.subscribe({complete(){r&&e.next(n),e.complete?.()},error:e.error,next(e){n=e,r=!0}})})}exports.debounce=s,exports.first=u,exports.last=d,exports.sample=l,exports.skip=i,exports.take=r,exports.takeUntil=a,exports.takeWhile=o,exports.throttle=c;
1
+ const e=require("../core.cjs"),t=require("../_link.cjs"),n=require("../errors.cjs"),r=require("../_scheduler.cjs");function i(e,t){if(!Number.isFinite(e)||e<0)throw RangeError(`${t} must be a finite number greater than or equal to zero`)}function a(n){if(!Number.isInteger(n)||n<0)throw RangeError(`take count must be a non-negative integer`);return r=>e.stream((e,i)=>{if(n===0){e.complete();return}let a=0,o={};return o.current=t.link(r,{complete:e.complete,error:e.error,next(t){e.next(t),a++,a===n&&(e.complete(),o.current?.unsubscribe())}},i),()=>o.current?.unsubscribe()})}function o(n){return r=>e.stream((e,i)=>{let a,o,s=()=>{},c=()=>{a?.unsubscribe(),o?.unsubscribe(),e.complete()};if(n instanceof AbortSignal){if(n.aborted){e.complete();return}n.addEventListener(`abort`,c,{once:!0}),s=()=>n.removeEventListener(`abort`,c)}else o=t.link(n,{error:e.error,next:c},i);return i.aborted||(a=t.link(r,{complete:e.complete,error:e.error,next:e.next},i)),()=>{s(),a?.unsubscribe(),o?.unsubscribe()}})}function s(n){return i(n.for,`Debounce duration`),i=>e.stream((e,a)=>{let o,s,c=!1,l=()=>{o=void 0,c&&(c=!1,e.next(s))},u=t.link(i,{complete(){o?.(),l(),e.complete()},error:e.error,next(e){s=e,c=!0,o?.(),o=r.defaultScheduler.delay(l,n.for)}},a);return()=>{o?.(),u.unsubscribe()}})}function c(a){return i(a.after,`Timeout duration`),i=>e.stream((e,o)=>{let s,c=()=>{s=r.defaultScheduler.delay(()=>e.error(new n.FluxTimeoutError(a.after)),a.after)};c();let l=t.link(i,{complete(){s(),e.complete()},error(t){s(),e.error(t)},next(t){s(),c(),e.next(t)}},o);return()=>{s(),l.unsubscribe()}})}exports.debounce=s,exports.take=a,exports.takeUntil=o,exports.timeout=c;
2
2
  //# sourceMappingURL=filtering.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"filtering.cjs","names":[],"sources":["../../src/operators/filtering.ts"],"sourcesContent":["import type { Flux, Operator, Scheduler, Unsubscribe } from '../types';\n\nimport { guard } from '../_safe';\nimport { DEFAULT_SCHEDULER } from '../_scheduler';\nimport { flux } from '../core';\n\n/**\n * Emit only the first `count` values, then complete.\n *\n * @example\n * interval(100).pipe(take(3)); // emits 0, 1, 2 then completes\n */\nexport function take<T>(count: number): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n if (count <= 0) {\n observer.complete?.();\n\n return;\n }\n\n let seen = 0;\n let unsub: Unsubscribe = () => {};\n\n unsub = source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n observer.next(v);\n seen++;\n\n if (seen >= count) {\n observer.complete?.();\n unsub();\n }\n },\n });\n\n return unsub;\n });\n}\n\n/** Skip the first `count` values, then emit the rest. */\nexport function skip<T>(count: number): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let skipped = 0;\n\n return source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n if (skipped < count) {\n skipped++;\n } else {\n observer.next(v);\n }\n },\n });\n });\n}\n\n/**\n * Complete when either `notifier` emits its first value or an `AbortSignal` aborts.\n *\n * @example\n * source$.pipe(takeUntil(stop$));\n * source$.pipe(takeUntil(abortController.signal));\n */\nexport function takeUntil<T>(notifier: AbortSignal | Flux<unknown>): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let done = false;\n\n const finish = (): void => {\n if (done) return;\n\n done = true;\n observer.complete?.();\n notifierUnsub();\n sourceUnsub?.();\n };\n\n let notifierUnsub: () => void;\n\n if (notifier instanceof AbortSignal) {\n if (notifier.aborted) {\n observer.complete?.();\n\n return;\n }\n\n notifier.addEventListener('abort', finish, { once: true });\n notifierUnsub = () => notifier.removeEventListener('abort', finish);\n } else {\n notifierUnsub = notifier.subscribe({ next: finish });\n }\n\n const sourceUnsub = source.subscribe({\n complete() {\n done = true;\n notifierUnsub();\n observer.complete?.();\n },\n error(err) {\n done = true;\n notifierUnsub();\n observer.error?.(err);\n },\n next: observer.next,\n });\n\n return () => {\n notifierUnsub();\n sourceUnsub();\n };\n });\n}\n\n/**\n * Emit values while `predicate` is truthy. Complete when it returns `false`.\n *\n * @example\n * of(1, 2, 3, 4).pipe(takeWhile((n) => n < 3)); // emits 1, 2\n */\nexport function takeWhile<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let unsub: Unsubscribe = () => {};\n\n unsub = source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n guard(() => {\n if (predicate(v)) {\n observer.next(v);\n } else {\n observer.complete?.();\n unsub();\n }\n }, observer.error);\n },\n });\n\n return unsub;\n });\n}\n\n/**\n * Emit the last value after `ms` milliseconds of silence.\n * Resets the timer on every source emission.\n *\n * **Note:** if the source completes while a value is pending (timer not yet fired),\n * the pending value is dropped. Only the completion signal is forwarded.\n *\n * @example\n * fromEvent(input, 'input').pipe(debounce(300)); // wait 300ms after last keystroke\n */\nexport function debounce<T>(ms: number, scheduler: Scheduler = DEFAULT_SCHEDULER): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let cancelTimer: (() => void) | undefined;\n\n const unsub = source.subscribe({\n complete() {\n cancelTimer?.();\n observer.complete?.();\n },\n error(err) {\n cancelTimer?.();\n observer.error?.(err);\n },\n next(v) {\n cancelTimer?.();\n cancelTimer = scheduler.delay(() => observer.next(v), ms);\n },\n });\n\n return () => {\n cancelTimer?.();\n unsub();\n };\n });\n}\n\n/**\n * Emit at most once per `ms` milliseconds. Leading edge by default.\n * Pass a custom `clock` function (default: `Date.now`) to control time in tests.\n *\n * @example\n * fromEvent(window, 'scroll').pipe(throttle(100));\n */\nexport function throttle<T>(ms: number, clock: () => number = Date.now): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let lastEmit = -Infinity;\n\n return source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n const now = clock();\n\n if (now - lastEmit >= ms) {\n lastEmit = now;\n observer.next(v);\n }\n },\n });\n });\n}\n\n/**\n * When `notifier` emits, emit the latest value from `source` (if any).\n * Useful for polling-like patterns.\n *\n * @example\n * source$.pipe(sample(interval(1000))); // emit latest value every 1s\n */\nexport function sample<T>(notifier: Flux<unknown>): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let latest: T;\n let hasValue = false;\n\n const sourceUnsub = source.subscribe({\n complete: observer.complete,\n error: observer.error,\n next(v) {\n latest = v;\n hasValue = true;\n },\n });\n\n const notifierUnsub = notifier.subscribe({\n next() {\n if (hasValue) observer.next(latest);\n },\n });\n\n return () => {\n sourceUnsub();\n notifierUnsub();\n };\n });\n}\n\n/** Emit only the first value, then complete. Equivalent to `take(1)`. */\nexport function first<T>(): Operator<T, T> {\n return take(1);\n}\n\n/**\n * Emit only the last value, collected when source completes.\n *\n * @example\n * of(1, 2, 3).pipe(last()); // emits 3\n */\nexport function last<T>(): Operator<T, T> {\n return (source) =>\n flux<T>((observer) => {\n let latest: T;\n let hasValue = false;\n\n return source.subscribe({\n complete() {\n if (hasValue) observer.next(latest);\n\n observer.complete?.();\n },\n error: observer.error,\n next(v) {\n latest = v;\n hasValue = true;\n },\n });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"filtering.cjs","names":[],"sources":["../../src/operators/filtering.ts"],"sourcesContent":["import type { Operator, Stream, Subscription } from '../types';\n\nimport { link } from '../_link';\nimport { defaultScheduler } from '../_scheduler';\nimport { stream } from '../core';\nimport { FluxTimeoutError } from '../errors';\n\nexport type DebounceOptions = {\n for: number;\n};\n\nexport type TimeoutOptions = {\n after: number;\n};\n\nfunction assertDuration(milliseconds: number, name: string): void {\n if (!Number.isFinite(milliseconds) || milliseconds < 0) {\n throw new RangeError(`${name} must be a finite number greater than or equal to zero`);\n }\n}\n\nexport function take<T>(count: number): Operator<T, T> {\n if (!Number.isInteger(count) || count < 0) {\n throw new RangeError('take count must be a non-negative integer');\n }\n\n return (source) =>\n stream((sink, signal) => {\n if (count === 0) {\n sink.complete();\n\n return;\n }\n\n let seen = 0;\n const subscriptionRef: { current?: Subscription } = {};\n\n subscriptionRef.current = link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n sink.next(value);\n seen++;\n\n if (seen === count) {\n sink.complete();\n subscriptionRef.current?.unsubscribe();\n }\n },\n },\n signal,\n );\n\n return () => subscriptionRef.current?.unsubscribe();\n });\n}\n\nexport function takeUntil<T>(notifier: AbortSignal | Stream<unknown>): Operator<T, T> {\n return (source) =>\n stream((sink, signal) => {\n let sourceSubscription: Subscription | undefined;\n let notifierSubscription: Subscription | undefined;\n let removeNotifier = (): void => {};\n\n const complete = (): void => {\n sourceSubscription?.unsubscribe();\n notifierSubscription?.unsubscribe();\n sink.complete();\n };\n\n if (notifier instanceof AbortSignal) {\n if (notifier.aborted) {\n sink.complete();\n\n return;\n }\n\n notifier.addEventListener('abort', complete, { once: true });\n removeNotifier = (): void => notifier.removeEventListener('abort', complete);\n } else {\n notifierSubscription = link(notifier, { error: sink.error, next: complete }, signal);\n }\n\n if (!signal.aborted) {\n sourceSubscription = link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n }\n\n return () => {\n removeNotifier();\n sourceSubscription?.unsubscribe();\n notifierSubscription?.unsubscribe();\n };\n });\n}\n\nexport function debounce<T>(options: DebounceOptions): Operator<T, T> {\n assertDuration(options.for, 'Debounce duration');\n\n return (source) =>\n stream((sink, signal) => {\n let cancel: (() => void) | undefined;\n let pending: T | undefined;\n let hasPending = false;\n\n const flush = (): void => {\n cancel = undefined;\n\n if (!hasPending) return;\n\n hasPending = false;\n sink.next(pending as T);\n };\n\n const subscription = link(\n source,\n {\n complete() {\n cancel?.();\n flush();\n sink.complete();\n },\n error: sink.error,\n next(value) {\n pending = value;\n hasPending = true;\n cancel?.();\n cancel = defaultScheduler.delay(flush, options.for);\n },\n },\n signal,\n );\n\n return () => {\n cancel?.();\n subscription.unsubscribe();\n };\n });\n}\n\nexport function timeout<T>(options: TimeoutOptions): Operator<T, T> {\n assertDuration(options.after, 'Timeout duration');\n\n return (source) =>\n stream((sink, signal) => {\n let cancel: () => void;\n\n const start = (): void => {\n cancel = defaultScheduler.delay(() => sink.error(new FluxTimeoutError(options.after)), options.after);\n };\n\n start();\n\n const subscription = link(\n source,\n {\n complete() {\n cancel();\n sink.complete();\n },\n error(reason) {\n cancel();\n sink.error(reason);\n },\n next(value) {\n cancel();\n start();\n sink.next(value);\n },\n },\n signal,\n );\n\n return () => {\n cancel();\n subscription.unsubscribe();\n };\n });\n}\n"],"mappings":"mHAeA,SAAS,EAAe,EAAsB,EAAoB,CAChE,GAAI,CAAC,OAAO,SAAS,CAAY,GAAK,EAAe,EACnD,MAAU,WAAW,GAAG,EAAK,uDAAuD,CAExF,CAEA,SAAgB,EAAQ,EAA+B,CACrD,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,EACtC,MAAU,WAAW,2CAA2C,EAGlE,MAAQ,IACN,EAAA,QAAQ,EAAM,IAAW,CACvB,GAAI,IAAU,EAAG,CACf,EAAK,SAAS,EAEd,MACF,CAEA,IAAI,EAAO,EACL,EAA8C,CAAC,EAoBrD,MAlBA,GAAgB,QAAU,EAAA,KACxB,EACA,CACE,SAAU,EAAK,SACf,MAAO,EAAK,MACZ,KAAK,EAAO,CACV,EAAK,KAAK,CAAK,EACf,IAEI,IAAS,IACX,EAAK,SAAS,EACd,EAAgB,SAAS,YAAY,EAEzC,CACF,EACA,CACF,MAEa,EAAgB,SAAS,YAAY,CACpD,CAAC,CACL,CAEA,SAAgB,EAAa,EAAyD,CACpF,MAAQ,IACN,EAAA,QAAQ,EAAM,IAAW,CACvB,IAAI,EACA,EACA,MAA6B,CAAC,EAE5B,MAAuB,CAC3B,GAAoB,YAAY,EAChC,GAAsB,YAAY,EAClC,EAAK,SAAS,CAChB,EAEA,GAAI,aAAoB,YAAa,CACnC,GAAI,EAAS,QAAS,CACpB,EAAK,SAAS,EAEd,MACF,CAEA,EAAS,iBAAiB,QAAS,EAAU,CAAE,KAAM,EAAK,CAAC,EAC3D,MAA6B,EAAS,oBAAoB,QAAS,CAAQ,CAC7E,KACE,GAAuB,EAAA,KAAK,EAAU,CAAE,MAAO,EAAK,MAAO,KAAM,CAAS,EAAG,CAAM,EAerF,OAZK,EAAO,UACV,EAAqB,EAAA,KACnB,EACA,CACE,SAAU,EAAK,SACf,MAAO,EAAK,MACZ,KAAM,EAAK,IACb,EACA,CACF,OAGW,CACX,EAAe,EACf,GAAoB,YAAY,EAChC,GAAsB,YAAY,CACpC,CACF,CAAC,CACL,CAEA,SAAgB,EAAY,EAA0C,CAGpE,OAFA,EAAe,EAAQ,IAAK,mBAAmB,EAEvC,GACN,EAAA,QAAQ,EAAM,IAAW,CACvB,IAAI,EACA,EACA,EAAa,GAEX,MAAoB,CACxB,EAAS,IAAA,GAEJ,IAEL,EAAa,GACb,EAAK,KAAK,CAAY,EACxB,EAEM,EAAe,EAAA,KACnB,EACA,CACE,UAAW,CACT,IAAS,EACT,EAAM,EACN,EAAK,SAAS,CAChB,EACA,MAAO,EAAK,MACZ,KAAK,EAAO,CACV,EAAU,EACV,EAAa,GACb,IAAS,EACT,EAAS,EAAA,iBAAiB,MAAM,EAAO,EAAQ,GAAG,CACpD,CACF,EACA,CACF,EAEA,UAAa,CACX,IAAS,EACT,EAAa,YAAY,CAC3B,CACF,CAAC,CACL,CAEA,SAAgB,EAAW,EAAyC,CAGlE,OAFA,EAAe,EAAQ,MAAO,kBAAkB,EAExC,GACN,EAAA,QAAQ,EAAM,IAAW,CACvB,IAAI,EAEE,MAAoB,CACxB,EAAS,EAAA,iBAAiB,UAAY,EAAK,MAAM,IAAI,EAAA,iBAAiB,EAAQ,KAAK,CAAC,EAAG,EAAQ,KAAK,CACtG,EAEA,EAAM,EAEN,IAAM,EAAe,EAAA,KACnB,EACA,CACE,UAAW,CACT,EAAO,EACP,EAAK,SAAS,CAChB,EACA,MAAM,EAAQ,CACZ,EAAO,EACP,EAAK,MAAM,CAAM,CACnB,EACA,KAAK,EAAO,CACV,EAAO,EACP,EAAM,EACN,EAAK,KAAK,CAAK,CACjB,CACF,EACA,CACF,EAEA,UAAa,CACX,EAAO,EACP,EAAa,YAAY,CAC3B,CACF,CAAC,CACL"}
@@ -1,62 +1,12 @@
1
- import type { Flux, Operator, Scheduler } from '../types';
2
- /**
3
- * Emit only the first `count` values, then complete.
4
- *
5
- * @example
6
- * interval(100).pipe(take(3)); // emits 0, 1, 2 then completes
7
- */
1
+ import type { Operator, Stream } from '../types';
2
+ export type DebounceOptions = {
3
+ for: number;
4
+ };
5
+ export type TimeoutOptions = {
6
+ after: number;
7
+ };
8
8
  export declare function take<T>(count: number): Operator<T, T>;
9
- /** Skip the first `count` values, then emit the rest. */
10
- export declare function skip<T>(count: number): Operator<T, T>;
11
- /**
12
- * Complete when either `notifier` emits its first value or an `AbortSignal` aborts.
13
- *
14
- * @example
15
- * source$.pipe(takeUntil(stop$));
16
- * source$.pipe(takeUntil(abortController.signal));
17
- */
18
- export declare function takeUntil<T>(notifier: AbortSignal | Flux<unknown>): Operator<T, T>;
19
- /**
20
- * Emit values while `predicate` is truthy. Complete when it returns `false`.
21
- *
22
- * @example
23
- * of(1, 2, 3, 4).pipe(takeWhile((n) => n < 3)); // emits 1, 2
24
- */
25
- export declare function takeWhile<T>(predicate: (value: T) => boolean): Operator<T, T>;
26
- /**
27
- * Emit the last value after `ms` milliseconds of silence.
28
- * Resets the timer on every source emission.
29
- *
30
- * **Note:** if the source completes while a value is pending (timer not yet fired),
31
- * the pending value is dropped. Only the completion signal is forwarded.
32
- *
33
- * @example
34
- * fromEvent(input, 'input').pipe(debounce(300)); // wait 300ms after last keystroke
35
- */
36
- export declare function debounce<T>(ms: number, scheduler?: Scheduler): Operator<T, T>;
37
- /**
38
- * Emit at most once per `ms` milliseconds. Leading edge by default.
39
- * Pass a custom `clock` function (default: `Date.now`) to control time in tests.
40
- *
41
- * @example
42
- * fromEvent(window, 'scroll').pipe(throttle(100));
43
- */
44
- export declare function throttle<T>(ms: number, clock?: () => number): Operator<T, T>;
45
- /**
46
- * When `notifier` emits, emit the latest value from `source` (if any).
47
- * Useful for polling-like patterns.
48
- *
49
- * @example
50
- * source$.pipe(sample(interval(1000))); // emit latest value every 1s
51
- */
52
- export declare function sample<T>(notifier: Flux<unknown>): Operator<T, T>;
53
- /** Emit only the first value, then complete. Equivalent to `take(1)`. */
54
- export declare function first<T>(): Operator<T, T>;
55
- /**
56
- * Emit only the last value, collected when source completes.
57
- *
58
- * @example
59
- * of(1, 2, 3).pipe(last()); // emits 3
60
- */
61
- export declare function last<T>(): Operator<T, T>;
9
+ export declare function takeUntil<T>(notifier: AbortSignal | Stream<unknown>): Operator<T, T>;
10
+ export declare function debounce<T>(options: DebounceOptions): Operator<T, T>;
11
+ export declare function timeout<T>(options: TimeoutOptions): Operator<T, T>;
62
12
  //# sourceMappingURL=filtering.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filtering.d.ts","sourceRoot":"","sources":["../../src/operators/filtering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAe,MAAM,UAAU,CAAC;AAMvE;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA4BrD;AAED,yDAAyD;AACzD,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAiBrD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgDlF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAsB7E;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,SAA6B,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAyBhG;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,MAAiB,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAkBtF;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA0BjE;AAED,yEAAyE;AACzE,wBAAgB,KAAK,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAmBxC"}
1
+ {"version":3,"file":"filtering.d.ts","sourceRoot":"","sources":["../../src/operators/filtering.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAgB,MAAM,UAAU,CAAC;AAO/D,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAQF,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAoCrD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA4CpF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA0CpE;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAsClE"}
@@ -1,140 +1,93 @@
1
- import { flux as e } from "../core.js";
2
- import { DEFAULT_SCHEDULER as t } from "../_scheduler.js";
3
- import { guard as n } from "../_safe.js";
1
+ import { stream as e } from "../core.js";
2
+ import { link as t } from "../_link.js";
3
+ import { FluxTimeoutError as n } from "../errors.js";
4
+ import { defaultScheduler as r } from "../_scheduler.js";
4
5
  //#region src/operators/filtering.ts
5
- function r(t) {
6
- return (n) => e((e) => {
7
- if (t <= 0) {
8
- e.complete?.();
6
+ function i(e, t) {
7
+ if (!Number.isFinite(e) || e < 0) throw RangeError(`${t} must be a finite number greater than or equal to zero`);
8
+ }
9
+ function a(n) {
10
+ if (!Number.isInteger(n) || n < 0) throw RangeError("take count must be a non-negative integer");
11
+ return (r) => e((e, i) => {
12
+ if (n === 0) {
13
+ e.complete();
9
14
  return;
10
15
  }
11
- let r = 0, i = () => {};
12
- return i = n.subscribe({
13
- complete: e.complete,
14
- error: e.error,
15
- next(n) {
16
- e.next(n), r++, r >= t && (e.complete?.(), i());
17
- }
18
- }), i;
19
- });
20
- }
21
- function i(t) {
22
- return (n) => e((e) => {
23
- let r = 0;
24
- return n.subscribe({
16
+ let a = 0, o = {};
17
+ return o.current = t(r, {
25
18
  complete: e.complete,
26
19
  error: e.error,
27
- next(n) {
28
- r < t ? r++ : e.next(n);
20
+ next(t) {
21
+ e.next(t), a++, a === n && (e.complete(), o.current?.unsubscribe());
29
22
  }
30
- });
23
+ }, i), () => o.current?.unsubscribe();
31
24
  });
32
25
  }
33
- function a(t) {
34
- return (n) => e((e) => {
35
- let r = !1, i = () => {
36
- r || (r = !0, e.complete?.(), a(), o?.());
37
- }, a;
38
- if (t instanceof AbortSignal) {
39
- if (t.aborted) {
40
- e.complete?.();
26
+ function o(n) {
27
+ return (r) => e((e, i) => {
28
+ let a, o, s = () => {}, c = () => {
29
+ a?.unsubscribe(), o?.unsubscribe(), e.complete();
30
+ };
31
+ if (n instanceof AbortSignal) {
32
+ if (n.aborted) {
33
+ e.complete();
41
34
  return;
42
35
  }
43
- t.addEventListener("abort", i, { once: !0 }), a = () => t.removeEventListener("abort", i);
44
- } else a = t.subscribe({ next: i });
45
- let o = n.subscribe({
46
- complete() {
47
- r = !0, a(), e.complete?.();
48
- },
49
- error(t) {
50
- r = !0, a(), e.error?.(t);
51
- },
52
- next: e.next
53
- });
54
- return () => {
55
- a(), o();
56
- };
57
- });
58
- }
59
- function o(t) {
60
- return (r) => e((e) => {
61
- let i = () => {};
62
- return i = r.subscribe({
36
+ n.addEventListener("abort", c, { once: !0 }), s = () => n.removeEventListener("abort", c);
37
+ } else o = t(n, {
38
+ error: e.error,
39
+ next: c
40
+ }, i);
41
+ return i.aborted || (a = t(r, {
63
42
  complete: e.complete,
64
43
  error: e.error,
65
- next(r) {
66
- n(() => {
67
- t(r) ? e.next(r) : (e.complete?.(), i());
68
- }, e.error);
69
- }
70
- }), i;
44
+ next: e.next
45
+ }, i)), () => {
46
+ s(), a?.unsubscribe(), o?.unsubscribe();
47
+ };
71
48
  });
72
49
  }
73
- function s(n, r = t) {
74
- return (t) => e((e) => {
75
- let i, a = t.subscribe({
50
+ function s(n) {
51
+ return i(n.for, "Debounce duration"), (i) => e((e, a) => {
52
+ let o, s, c = !1, l = () => {
53
+ o = void 0, c && (c = !1, e.next(s));
54
+ }, u = t(i, {
76
55
  complete() {
77
- i?.(), e.complete?.();
78
- },
79
- error(t) {
80
- i?.(), e.error?.(t);
56
+ o?.(), l(), e.complete();
81
57
  },
82
- next(t) {
83
- i?.(), i = r.delay(() => e.next(t), n);
84
- }
85
- });
86
- return () => {
87
- i?.(), a();
88
- };
89
- });
90
- }
91
- function c(t, n = Date.now) {
92
- return (r) => e((e) => {
93
- let i = -Infinity;
94
- return r.subscribe({
95
- complete: e.complete,
96
- error: e.error,
97
- next(r) {
98
- let a = n();
99
- a - i >= t && (i = a, e.next(r));
100
- }
101
- });
102
- });
103
- }
104
- function l(t) {
105
- return (n) => e((e) => {
106
- let r, i = !1, a = n.subscribe({
107
- complete: e.complete,
108
58
  error: e.error,
109
59
  next(e) {
110
- r = e, i = !0;
60
+ s = e, c = !0, o?.(), o = r.delay(l, n.for);
111
61
  }
112
- }), o = t.subscribe({ next() {
113
- i && e.next(r);
114
- } });
62
+ }, a);
115
63
  return () => {
116
- a(), o();
64
+ o?.(), u.unsubscribe();
117
65
  };
118
66
  });
119
67
  }
120
- function u() {
121
- return r(1);
122
- }
123
- function d() {
124
- return (t) => e((e) => {
125
- let n, r = !1;
126
- return t.subscribe({
68
+ function c(a) {
69
+ return i(a.after, "Timeout duration"), (i) => e((e, o) => {
70
+ let s, c = () => {
71
+ s = r.delay(() => e.error(new n(a.after)), a.after);
72
+ };
73
+ c();
74
+ let l = t(i, {
127
75
  complete() {
128
- r && e.next(n), e.complete?.();
76
+ s(), e.complete();
129
77
  },
130
- error: e.error,
131
- next(e) {
132
- n = e, r = !0;
78
+ error(t) {
79
+ s(), e.error(t);
80
+ },
81
+ next(t) {
82
+ s(), c(), e.next(t);
133
83
  }
134
- });
84
+ }, o);
85
+ return () => {
86
+ s(), l.unsubscribe();
87
+ };
135
88
  });
136
89
  }
137
90
  //#endregion
138
- export { s as debounce, u as first, d as last, l as sample, i as skip, r as take, a as takeUntil, o as takeWhile, c as throttle };
91
+ export { s as debounce, a as take, o as takeUntil, c as timeout };
139
92
 
140
93
  //# sourceMappingURL=filtering.js.map