@vielzeug/flux 2.3.3 → 3.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 (134) hide show
  1. package/README.md +13 -23
  2. package/dist/_iterator.cjs +1 -1
  3. package/dist/_iterator.cjs.map +1 -1
  4. package/dist/_iterator.d.ts +1 -1
  5. package/dist/_iterator.d.ts.map +1 -1
  6. package/dist/_iterator.js +35 -31
  7. package/dist/_iterator.js.map +1 -1
  8. package/dist/_link.cjs.map +1 -1
  9. package/dist/_link.d.ts +1 -1
  10. package/dist/_link.d.ts.map +1 -1
  11. package/dist/_link.js.map +1 -1
  12. package/dist/_numeric.cjs +1 -1
  13. package/dist/_numeric.cjs.map +1 -1
  14. package/dist/_numeric.js +1 -1
  15. package/dist/_numeric.js.map +1 -1
  16. package/dist/_subscription.cjs +1 -1
  17. package/dist/_subscription.cjs.map +1 -1
  18. package/dist/_subscription.d.ts +1 -1
  19. package/dist/_subscription.d.ts.map +1 -1
  20. package/dist/_subscription.js +1 -1
  21. package/dist/_subscription.js.map +1 -1
  22. package/dist/async.cjs.map +1 -1
  23. package/dist/async.d.ts +1 -1
  24. package/dist/async.d.ts.map +1 -1
  25. package/dist/async.js.map +1 -1
  26. package/dist/channel.cjs +1 -1
  27. package/dist/channel.cjs.map +1 -1
  28. package/dist/channel.d.ts +1 -1
  29. package/dist/channel.d.ts.map +1 -1
  30. package/dist/channel.js +14 -6
  31. package/dist/channel.js.map +1 -1
  32. package/dist/core.cjs +1 -1
  33. package/dist/core.cjs.map +1 -1
  34. package/dist/core.d.ts +8 -1
  35. package/dist/core.d.ts.map +1 -1
  36. package/dist/core.js +30 -1
  37. package/dist/core.js.map +1 -1
  38. package/dist/errors.cjs +1 -1
  39. package/dist/errors.cjs.map +1 -1
  40. package/dist/errors.d.ts +14 -0
  41. package/dist/errors.d.ts.map +1 -1
  42. package/dist/errors.js +15 -2
  43. package/dist/errors.js.map +1 -1
  44. package/dist/flux.cjs +1 -1
  45. package/dist/flux.cjs.map +1 -1
  46. package/dist/flux.iife.js +1 -1
  47. package/dist/flux.iife.js.map +1 -1
  48. package/dist/flux.js +1 -1
  49. package/dist/flux.js.map +1 -1
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.d.ts +13 -14
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +10 -10
  54. package/dist/operators/combination.cjs +1 -1
  55. package/dist/operators/combination.cjs.map +1 -1
  56. package/dist/operators/combination.d.ts +1 -1
  57. package/dist/operators/combination.d.ts.map +1 -1
  58. package/dist/operators/combination.js +28 -13
  59. package/dist/operators/combination.js.map +1 -1
  60. package/dist/operators/creation.cjs +1 -1
  61. package/dist/operators/creation.cjs.map +1 -1
  62. package/dist/operators/creation.d.ts +2 -5
  63. package/dist/operators/creation.d.ts.map +1 -1
  64. package/dist/operators/creation.js +36 -30
  65. package/dist/operators/creation.js.map +1 -1
  66. package/dist/operators/filtering.cjs +1 -1
  67. package/dist/operators/filtering.cjs.map +1 -1
  68. package/dist/operators/filtering.d.ts +3 -9
  69. package/dist/operators/filtering.d.ts.map +1 -1
  70. package/dist/operators/filtering.js +32 -29
  71. package/dist/operators/filtering.js.map +1 -1
  72. package/dist/operators/transformation.cjs +1 -1
  73. package/dist/operators/transformation.cjs.map +1 -1
  74. package/dist/operators/transformation.d.ts +7 -4
  75. package/dist/operators/transformation.d.ts.map +1 -1
  76. package/dist/operators/transformation.js +82 -92
  77. package/dist/operators/transformation.js.map +1 -1
  78. package/dist/operators/utility.cjs +1 -1
  79. package/dist/operators/utility.cjs.map +1 -1
  80. package/dist/operators/utility.d.ts +6 -4
  81. package/dist/operators/utility.d.ts.map +1 -1
  82. package/dist/operators/utility.js +60 -53
  83. package/dist/operators/utility.js.map +1 -1
  84. package/dist/pipe.cjs.map +1 -1
  85. package/dist/pipe.d.ts +1 -1
  86. package/dist/pipe.d.ts.map +1 -1
  87. package/dist/pipe.js.map +1 -1
  88. package/dist/subjects.d.ts +2 -2
  89. package/dist/subjects.d.ts.map +1 -1
  90. package/package.json +10 -62
  91. package/dist/_dev.cjs +0 -2
  92. package/dist/_dev.cjs.map +0 -1
  93. package/dist/_dev.js +0 -6
  94. package/dist/_dev.js.map +0 -1
  95. package/dist/adapters/courier.cjs +0 -2
  96. package/dist/adapters/courier.cjs.map +0 -1
  97. package/dist/adapters/courier.d.ts +0 -31
  98. package/dist/adapters/courier.d.ts.map +0 -1
  99. package/dist/adapters/courier.js +0 -12
  100. package/dist/adapters/courier.js.map +0 -1
  101. package/dist/adapters/herald.cjs +0 -2
  102. package/dist/adapters/herald.cjs.map +0 -1
  103. package/dist/adapters/herald.d.ts +0 -5
  104. package/dist/adapters/herald.d.ts.map +0 -1
  105. package/dist/adapters/herald.js +0 -22
  106. package/dist/adapters/herald.js.map +0 -1
  107. package/dist/adapters/pulse.cjs +0 -2
  108. package/dist/adapters/pulse.cjs.map +0 -1
  109. package/dist/adapters/pulse.d.ts +0 -5
  110. package/dist/adapters/pulse.d.ts.map +0 -1
  111. package/dist/adapters/pulse.js +0 -18
  112. package/dist/adapters/pulse.js.map +0 -1
  113. package/dist/adapters/ripple.cjs +0 -2
  114. package/dist/adapters/ripple.cjs.map +0 -1
  115. package/dist/adapters/ripple.d.ts +0 -19
  116. package/dist/adapters/ripple.d.ts.map +0 -1
  117. package/dist/adapters/ripple.js +0 -43
  118. package/dist/adapters/ripple.js.map +0 -1
  119. package/dist/courier.cjs +0 -1
  120. package/dist/courier.d.ts +0 -2
  121. package/dist/courier.d.ts.map +0 -1
  122. package/dist/courier.js +0 -2
  123. package/dist/herald.cjs +0 -1
  124. package/dist/herald.d.ts +0 -2
  125. package/dist/herald.d.ts.map +0 -1
  126. package/dist/herald.js +0 -2
  127. package/dist/pulse.cjs +0 -1
  128. package/dist/pulse.d.ts +0 -2
  129. package/dist/pulse.d.ts.map +0 -1
  130. package/dist/pulse.js +0 -2
  131. package/dist/ripple.cjs +0 -1
  132. package/dist/ripple.d.ts +0 -3
  133. package/dist/ripple.d.ts.map +0 -1
  134. package/dist/ripple.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"filtering.js","names":[],"sources":["../../src/operators/filtering.ts"],"sourcesContent":["import { link } from '../_link';\nimport { assertDuration, assertNonNegativeInteger } from '../_numeric';\nimport { defaultScheduler } from '../_scheduler';\nimport { stream } from '../core';\nimport { FluxTimeoutError } from '../errors';\nimport type { Operator, Stream, Subscription } from '../types';\n\nexport type DebounceOptions = {\n for: number;\n};\n\nexport type TimeoutOptions = {\n after: number;\n};\n\nexport function take<T>(count: number): Operator<T, T> {\n assertNonNegativeInteger(count, 'take count');\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":";;;;;;AAeA,SAAgB,EAAQ,GAA+B;CAGrD,OAFA,EAAyB,GAAO,YAAY,IAEpC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,MAAU,GAAG;GACf,EAAK,SAAS;GAEd;EACF;EAEA,IAAI,IAAO,GACL,IAA8C,CAAC;EAoBrD,OAlBA,EAAgB,UAAU,EACxB,GACA;GACE,UAAU,EAAK;GACf,OAAO,EAAK;GACZ,KAAK,GAAO;IAIV,AAHA,EAAK,KAAK,CAAK,GACf,KAEI,MAAS,MACX,EAAK,SAAS,GACd,EAAgB,SAAS,YAAY;GAEzC;EACF,GACA,CACF,SAEa,EAAgB,SAAS,YAAY;CACpD,CAAC;AACL;AAEA,SAAgB,EAAa,GAAyD;CACpF,QAAQ,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GACA,GACA,UAA6B,CAAC,GAE5B,UAAuB;GAG3B,AAFA,GAAoB,YAAY,GAChC,GAAsB,YAAY,GAClC,EAAK,SAAS;EAChB;EAEA,IAAI,aAAoB,aAAa;GACnC,IAAI,EAAS,SAAS;IACpB,EAAK,SAAS;IAEd;GACF;GAGA,AADA,EAAS,iBAAiB,SAAS,GAAU,EAAE,MAAM,GAAK,CAAC,GAC3D,UAA6B,EAAS,oBAAoB,SAAS,CAAQ;EAC7E,OACE,IAAuB,EAAK,GAAU;GAAE,OAAO,EAAK;GAAO,MAAM;EAAS,GAAG,CAAM;EAerF,OAZK,EAAO,YACV,IAAqB,EACnB,GACA;GACE,UAAU,EAAK;GACf,OAAO,EAAK;GACZ,MAAM,EAAK;EACb,GACA,CACF,UAGW;GAGX,AAFA,EAAe,GACf,GAAoB,YAAY,GAChC,GAAsB,YAAY;EACpC;CACF,CAAC;AACL;AAEA,SAAgB,EAAY,GAA0C;CAGpE,OAFA,EAAe,EAAQ,KAAK,mBAAmB,IAEvC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GACA,GACA,IAAa,IAEX,UAAoB;GACxB,IAAS,KAAA,GAEJ,MAEL,IAAa,IACb,EAAK,KAAK,CAAY;EACxB,GAEM,IAAe,EACnB,GACA;GACE,WAAW;IAGT,AAFA,IAAS,GACT,EAAM,GACN,EAAK,SAAS;GAChB;GACA,OAAO,EAAK;GACZ,KAAK,GAAO;IAIV,AAHA,IAAU,GACV,IAAa,IACb,IAAS,GACT,IAAS,EAAiB,MAAM,GAAO,EAAQ,GAAG;GACpD;EACF,GACA,CACF;EAEA,aAAa;GAEX,AADA,IAAS,GACT,EAAa,YAAY;EAC3B;CACF,CAAC;AACL;AAEA,SAAgB,EAAW,GAAyC;CAGlE,OAFA,EAAe,EAAQ,OAAO,kBAAkB,IAExC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GAEE,UAAoB;GACxB,IAAS,EAAiB,YAAY,EAAK,MAAM,IAAI,EAAiB,EAAQ,KAAK,CAAC,GAAG,EAAQ,KAAK;EACtG;EAEA,EAAM;EAEN,IAAM,IAAe,EACnB,GACA;GACE,WAAW;IAET,AADA,EAAO,GACP,EAAK,SAAS;GAChB;GACA,MAAM,GAAQ;IAEZ,AADA,EAAO,GACP,EAAK,MAAM,CAAM;GACnB;GACA,KAAK,GAAO;IAGV,AAFA,EAAO,GACP,EAAM,GACN,EAAK,KAAK,CAAK;GACjB;EACF,GACA,CACF;EAEA,aAAa;GAEX,AADA,EAAO,GACP,EAAa,YAAY;EAC3B;CACF,CAAC;AACL"}
1
+ {"version":3,"file":"filtering.js","names":[],"sources":["../../src/operators/filtering.ts"],"sourcesContent":["import { link } from '../_link.js';\nimport { assertDuration, assertNonNegativeInteger } from '../_numeric.js';\nimport { defaultScheduler } from '../_scheduler.js';\nimport { stream } from '../core.js';\nimport { FluxTimeoutError } from '../errors.js';\nimport type { Operator, Stream, Subscription } from '../types.js';\n\nexport function take<T>(count: number): Operator<T, T> {\n assertNonNegativeInteger(count, 'take count');\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\nfunction isAbortSignal(value: AbortSignal | Stream<unknown>): value is AbortSignal {\n return (\n typeof (value as AbortSignal).aborted === 'boolean' &&\n typeof (value as AbortSignal).addEventListener === 'function' &&\n typeof (value as AbortSignal).removeEventListener === 'function'\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 (isAbortSignal(notifier)) {\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>(duration: number): Operator<T, T> {\n assertDuration(duration, '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, duration);\n },\n },\n signal,\n );\n\n return () => {\n cancel?.();\n subscription.unsubscribe();\n };\n });\n}\n\nexport function timeout<T>(duration: number): Operator<T, T> {\n assertDuration(duration, '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(duration)), duration);\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":";;;;;;AAOA,SAAgB,EAAQ,GAA+B;CAGrD,OAFA,EAAyB,GAAO,YAAY,IAEpC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,MAAU,GAAG;GACf,EAAK,SAAS;GAEd;EACF;EAEA,IAAI,IAAO,GACL,IAA8C,CAAC;EAoBrD,OAlBA,EAAgB,UAAU,EACxB,GACA;GACE,UAAU,EAAK;GACf,OAAO,EAAK;GACZ,KAAK,GAAO;IAIV,AAHA,EAAK,KAAK,CAAK,GACf,KAEI,MAAS,MACX,EAAK,SAAS,GACd,EAAgB,SAAS,YAAY;GAEzC;EACF,GACA,CACF,SAEa,EAAgB,SAAS,YAAY;CACpD,CAAC;AACL;AAEA,SAAS,EAAc,GAA4D;CACjF,OACE,OAAQ,EAAsB,WAAY,aAC1C,OAAQ,EAAsB,oBAAqB,cACnD,OAAQ,EAAsB,uBAAwB;AAE1D;AAEA,SAAgB,EAAa,GAAyD;CACpF,QAAQ,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GACA,GACA,UAA6B,CAAC,GAE5B,UAAuB;GAG3B,AAFA,GAAoB,YAAY,GAChC,GAAsB,YAAY,GAClC,EAAK,SAAS;EAChB;EAEA,IAAI,EAAc,CAAQ,GAAG;GAC3B,IAAI,EAAS,SAAS;IACpB,EAAK,SAAS;IAEd;GACF;GAGA,AADA,EAAS,iBAAiB,SAAS,GAAU,EAAE,MAAM,GAAK,CAAC,GAC3D,UAA6B,EAAS,oBAAoB,SAAS,CAAQ;EAC7E,OACE,IAAuB,EAAK,GAAU;GAAE,OAAO,EAAK;GAAO,MAAM;EAAS,GAAG,CAAM;EAerF,OAZK,EAAO,YACV,IAAqB,EACnB,GACA;GACE,UAAU,EAAK;GACf,OAAO,EAAK;GACZ,MAAM,EAAK;EACb,GACA,CACF,UAGW;GAGX,AAFA,EAAe,GACf,GAAoB,YAAY,GAChC,GAAsB,YAAY;EACpC;CACF,CAAC;AACL;AAEA,SAAgB,EAAY,GAAkC;CAG5D,OAFA,EAAe,GAAU,mBAAmB,IAEpC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GACA,GACA,IAAa,IAEX,UAAoB;GACxB,IAAS,KAAA,GAEJ,MAEL,IAAa,IACb,EAAK,KAAK,CAAY;EACxB,GAEM,IAAe,EACnB,GACA;GACE,WAAW;IAGT,AAFA,IAAS,GACT,EAAM,GACN,EAAK,SAAS;GAChB;GACA,OAAO,EAAK;GACZ,KAAK,GAAO;IAIV,AAHA,IAAU,GACV,IAAa,IACb,IAAS,GACT,IAAS,EAAiB,MAAM,GAAO,CAAQ;GACjD;EACF,GACA,CACF;EAEA,aAAa;GAEX,AADA,IAAS,GACT,EAAa,YAAY;EAC3B;CACF,CAAC;AACL;AAEA,SAAgB,EAAW,GAAkC;CAG3D,OAFA,EAAe,GAAU,kBAAkB,IAEnC,MACN,GAAQ,GAAM,MAAW;EACvB,IAAI,GAEE,UAAoB;GACxB,IAAS,EAAiB,YAAY,EAAK,MAAM,IAAI,EAAiB,CAAQ,CAAC,GAAG,CAAQ;EAC5F;EAEA,EAAM;EAEN,IAAM,IAAe,EACnB,GACA;GACE,WAAW;IAET,AADA,EAAO,GACP,EAAK,SAAS;GAChB;GACA,MAAM,GAAQ;IAEZ,AADA,EAAO,GACP,EAAK,MAAM,CAAM;GACnB;GACA,KAAK,GAAO;IAGV,AAFA,EAAO,GACP,EAAM,GACN,EAAK,KAAK,CAAK;GACjB;EACF,GACA,CACF;EAEA,aAAa;GAEX,AADA,EAAO,GACP,EAAa,YAAY;EAC3B;CACF,CAAC;AACL"}
@@ -1,2 +1,2 @@
1
- const e=require("../_numeric.cjs"),t=require("../core.cjs"),n=require("../_link.cjs"),r=require("../_safe.cjs");function i(e){return i=>t.stream((t,a)=>n.link(i,{complete:t.complete,error:t.error,next(n){r.tryCall(()=>t.next(e(n)),t.error)}},a).unsubscribe)}function a(e){return i=>t.stream((t,a)=>n.link(i,{complete:t.complete,error:t.error,next(n){r.tryCall(()=>{e(n)&&t.next(n)},t.error)}},a).unsubscribe)}function o(e,i){return a=>t.stream((t,o)=>{let s=i;return n.link(a,{complete:t.complete,error:t.error,next(n){r.tryCall(()=>{s=e(s,n),t.next(s)},t.error)}},o).unsubscribe})}function s(e){return i=>t.stream((t,a)=>{let o=!1,s,c=()=>{o&&!s&&t.complete()},l=n.link(i,{complete(){o=!0,c()},error:t.error,next(i){s?.unsubscribe(),s=void 0,r.tryCall(()=>{let r=n.link(e(i),{complete(){s=void 0,c()},error:t.error,next:t.next},a);s=r.closed?void 0:r},t.error)}},a);return()=>{l.unsubscribe(),s?.unsubscribe()}})}function c(e){return i=>t.stream((t,a)=>{let o=!1,s=new Set,c=()=>{o&&s.size===0&&t.complete()},l=n.link(i,{complete(){o=!0,c()},error:t.error,next(i){r.tryCall(()=>{let r={};r.current=n.link(e(i),{complete(){r.current&&s.delete(r.current),c()},error:t.error,next:t.next},a),r.current.closed||s.add(r.current)},t.error)}},a);return()=>{l.unsubscribe();for(let e of s)e.unsubscribe()}})}function l(i,a){return e.assertPositiveInteger(a.capacity,`concatMap capacity`),e=>t.stream((t,o)=>{let s=[],c=!1,l,u={},d=()=>{if(l||s.length===0){c&&!l&&s.length===0&&t.complete();return}let e=s.shift();r.tryCall(()=>{let r=n.link(i(e),{complete(){l=void 0,d()},error:t.error,next:t.next},o);l=r.closed?void 0:r,l||d()},t.error)};return u.current=n.link(e,{complete(){c=!0,d()},error:t.error,next(e){if(s.length===a.capacity){u.current?.unsubscribe(),t.error(RangeError(`concatMap buffer capacity exceeded`));return}s.push(e),d()}},o),()=>{u.current?.unsubscribe(),l?.unsubscribe(),s.length=0}})}exports.concatMap=l,exports.filter=a,exports.map=i,exports.mergeMap=c,exports.scan=o,exports.switchMap=s;
1
+ const e=require("../_numeric.cjs"),t=require("../errors.cjs"),n=require("../core.cjs"),r=require("../_link.cjs"),i=require("../_safe.cjs");function a(e){return t=>n.stream((n,a)=>r.link(t,{complete:n.complete,error:n.error,next(t){i.tryCall(()=>n.next(e(t)),n.error)}},a).unsubscribe)}function o(e){return t=>n.stream((n,a)=>r.link(t,{complete:n.complete,error:n.error,next(t){i.tryCall(()=>{e(t)&&n.next(t)},n.error)}},a).unsubscribe)}function s(e,t){return a=>n.stream((n,o)=>{let s=t;return r.link(a,{complete:n.complete,error:n.error,next(t){i.tryCall(()=>{s=e(s,t),n.next(s)},n.error)}},o).unsubscribe})}function c(e){return t=>n.stream((n,a)=>{let o=!1,s,c=()=>{o&&!s&&n.complete()},l=r.link(t,{complete(){o=!0,c()},error:n.error,next(t){s?.unsubscribe(),s=void 0,i.tryCall(()=>{let i=r.link(e(t),{complete(){s=void 0,c()},error:n.error,next:n.next},a);s=i.closed?void 0:i},n.error)}},a);return()=>{l.unsubscribe(),s?.unsubscribe()}})}function l(a,o){let s=o.concurrency===1/0;return s||(e.assertPositiveInteger(o.concurrency,`mergeMap concurrency`),e.assertPositiveInteger(o.capacity,`mergeMap capacity`)),e=>n.stream((n,c)=>{let l=[],u=new Set,d=!1,f={},p=()=>{d&&u.size===0&&l.length===0&&n.complete()},m=e=>{i.tryCall(()=>{let t={};t.current=r.link(a(e),{complete(){t.current&&u.delete(t.current),h()},error:n.error,next:n.next},c),t.current.closed?h():u.add(t.current)},n.error)},h=()=>{if(!c.aborted){for(;l.length>0&&(s||u.size<o.concurrency);){let e=l.shift();m(e)}p()}};return f.current=r.link(e,{complete(){d=!0,p()},error:n.error,next(e){if(!s&&l.length>=o.capacity){f.current?.unsubscribe(),n.error(new t.FluxCapacityError(o.capacity,`mergeMap buffer capacity exceeded`));return}l.push(e),h()}},c),()=>{f.current?.unsubscribe();for(let e of u)e.unsubscribe();l.length=0}})}function u(e,t){return l(e,t)}function d(e,t){return l(e,{capacity:t.capacity,concurrency:1})}exports.concatMap=d,exports.filter=o,exports.map=a,exports.mergeMap=u,exports.scan=s,exports.switchMap=c;
2
2
  //# sourceMappingURL=transformation.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformation.cjs","names":[],"sources":["../../src/operators/transformation.ts"],"sourcesContent":["import { link } from '../_link';\nimport { assertPositiveInteger } from '../_numeric';\nimport { tryCall } from '../_safe';\nimport { stream } from '../core';\nimport type { Operator, Stream, Subscription } from '../types';\n\nexport type ConcatMapOptions = {\n capacity: number;\n};\n\nexport function map<A, B>(project: (value: A) => B): Operator<A, B> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => sink.next(project(value)), sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n if (predicate(value)) sink.next(value);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function scan<T, A>(reducer: (state: A, value: T) => A, initial: A): Operator<T, A> {\n return (source) =>\n stream((sink, signal) => {\n let state = initial;\n\n return link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n state = reducer(state, value);\n sink.next(state);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe;\n });\n}\n\nexport function switchMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n let inner: Subscription | undefined;\n\n const finish = (): void => {\n if (outerComplete && !inner) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n inner?.unsubscribe();\n inner = undefined;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n inner?.unsubscribe();\n };\n });\n}\n\nexport function mergeMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n const inners = new Set<Subscription>();\n\n const finish = (): void => {\n if (outerComplete && inners.size === 0) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n tryCall(() => {\n const innerRef: { current?: Subscription } = {};\n\n innerRef.current = link(\n project(value),\n {\n complete() {\n if (innerRef.current) inners.delete(innerRef.current);\n\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n if (!innerRef.current.closed) inners.add(innerRef.current);\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n for (const inner of inners) inner.unsubscribe();\n };\n });\n}\n\nexport function concatMap<A, B>(project: (value: A) => Stream<B>, options: ConcatMapOptions): Operator<A, B> {\n assertPositiveInteger(options.capacity, 'concatMap capacity');\n\n return (source) =>\n stream((sink, signal) => {\n const queue: A[] = [];\n let outerComplete = false;\n let inner: Subscription | undefined;\n const outerRef: { current?: Subscription } = {};\n\n const next = (): void => {\n if (inner || queue.length === 0) {\n if (outerComplete && !inner && queue.length === 0) sink.complete();\n\n return;\n }\n\n const value = queue.shift()!;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n next();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n\n if (!inner) next();\n }, sink.error);\n };\n\n outerRef.current = link(\n source,\n {\n complete() {\n outerComplete = true;\n next();\n },\n error: sink.error,\n next(value) {\n if (queue.length === options.capacity) {\n outerRef.current?.unsubscribe();\n sink.error(new RangeError('concatMap buffer capacity exceeded'));\n\n return;\n }\n\n queue.push(value);\n next();\n },\n },\n signal,\n );\n\n return () => {\n outerRef.current?.unsubscribe();\n inner?.unsubscribe();\n queue.length = 0;\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transformation.cjs","names":[],"sources":["../../src/operators/transformation.ts"],"sourcesContent":["import { link } from '../_link.js';\nimport { assertPositiveInteger } from '../_numeric.js';\nimport { tryCall } from '../_safe.js';\nimport { stream } from '../core.js';\nimport { FluxCapacityError } from '../errors.js';\nimport type { Operator, Stream, Subscription } from '../types.js';\n\nexport type FlattenOptions = {\n /** Maximum concurrently active inner subscriptions. Use `Infinity` for unbounded concurrency. */\n concurrency: number;\n /** Maximum queued outer values waiting for an inner subscription slot. Required when `concurrency` is finite. */\n capacity: number;\n};\n\nexport function map<A, B>(project: (value: A) => B): Operator<A, B> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => sink.next(project(value)), sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n if (predicate(value)) sink.next(value);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function scan<T, A>(reducer: (state: A, value: T) => A, initial: A): Operator<T, A> {\n return (source) =>\n stream((sink, signal) => {\n let state = initial;\n\n return link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n state = reducer(state, value);\n sink.next(state);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe;\n });\n}\n\nexport function switchMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n let inner: Subscription | undefined;\n\n const finish = (): void => {\n if (outerComplete && !inner) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n inner?.unsubscribe();\n inner = undefined;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n inner?.unsubscribe();\n };\n });\n}\n\nfunction flatten<A, B>(project: (value: A) => Stream<B>, options: FlattenOptions): Operator<A, B> {\n const unbounded = options.concurrency === Infinity;\n\n if (!unbounded) {\n assertPositiveInteger(options.concurrency, 'mergeMap concurrency');\n assertPositiveInteger(options.capacity, 'mergeMap capacity');\n }\n\n return (source) =>\n stream((sink, signal) => {\n const queue: A[] = [];\n const inners = new Set<Subscription>();\n let outerComplete = false;\n const outerRef: { current?: Subscription } = {};\n\n const finish = (): void => {\n if (outerComplete && inners.size === 0 && queue.length === 0) sink.complete();\n };\n\n const startInner = (value: A): void => {\n tryCall(() => {\n const innerRef: { current?: Subscription } = {};\n\n innerRef.current = link(\n project(value),\n {\n complete() {\n if (innerRef.current) inners.delete(innerRef.current);\n\n drain();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n if (!innerRef.current.closed) inners.add(innerRef.current);\n else drain();\n }, sink.error);\n };\n\n const drain = (): void => {\n if (signal.aborted) return;\n\n while (queue.length > 0 && (unbounded || inners.size < options.concurrency)) {\n const value = queue.shift()!;\n\n startInner(value);\n }\n\n finish();\n };\n\n outerRef.current = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n if (!unbounded && queue.length >= options.capacity) {\n outerRef.current?.unsubscribe();\n sink.error(new FluxCapacityError(options.capacity, 'mergeMap buffer capacity exceeded'));\n\n return;\n }\n\n queue.push(value);\n drain();\n },\n },\n signal,\n );\n\n return () => {\n outerRef.current?.unsubscribe();\n for (const inner of inners) inner.unsubscribe();\n queue.length = 0;\n };\n });\n}\n\nexport function mergeMap<A, B>(project: (value: A) => Stream<B>, options: FlattenOptions): Operator<A, B> {\n return flatten(project, options);\n}\n\nexport function concatMap<A, B>(\n project: (value: A) => Stream<B>,\n options: Omit<FlattenOptions, 'concurrency'>,\n): Operator<A, B> {\n return flatten(project, { capacity: options.capacity, concurrency: 1 });\n}\n"],"mappings":"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"}
@@ -1,11 +1,14 @@
1
- import type { Operator, Stream } from '../types';
2
- export type ConcatMapOptions = {
1
+ import type { Operator, Stream } from '../types.js';
2
+ export type FlattenOptions = {
3
+ /** Maximum concurrently active inner subscriptions. Use `Infinity` for unbounded concurrency. */
4
+ concurrency: number;
5
+ /** Maximum queued outer values waiting for an inner subscription slot. Required when `concurrency` is finite. */
3
6
  capacity: number;
4
7
  };
5
8
  export declare function map<A, B>(project: (value: A) => B): Operator<A, B>;
6
9
  export declare function filter<T>(predicate: (value: T) => boolean): Operator<T, T>;
7
10
  export declare function scan<T, A>(reducer: (state: A, value: T) => A, initial: A): Operator<T, A>;
8
11
  export declare function switchMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B>;
9
- export declare function mergeMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B>;
10
- export declare function concatMap<A, B>(project: (value: A) => Stream<B>, options: ConcatMapOptions): Operator<A, B>;
12
+ export declare function mergeMap<A, B>(project: (value: A) => Stream<B>, options: FlattenOptions): Operator<A, B>;
13
+ export declare function concatMap<A, B>(project: (value: A) => Stream<B>, options: Omit<FlattenOptions, 'concurrency'>): Operator<A, B>;
11
14
  //# sourceMappingURL=transformation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformation.d.ts","sourceRoot":"","sources":["../../src/operators/transformation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAgB,MAAM,UAAU,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgBlE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAkB1E;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAoBzF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgDhF;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgD/E;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAoE3G"}
1
+ {"version":3,"file":"transformation.d.ts","sourceRoot":"","sources":["../../src/operators/transformation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAElE,MAAM,MAAM,cAAc,GAAG;IAC3B,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;IACpB,iHAAiH;IACjH,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgBlE;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAkB1E;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAoBzF;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAgDhF;AAuFD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAExG;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAChC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GAC3C,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAEhB"}
@@ -1,62 +1,63 @@
1
1
  import { assertPositiveInteger as e } from "../_numeric.js";
2
- import { stream as t } from "../core.js";
3
- import { link as n } from "../_link.js";
4
- import { tryCall as r } from "../_safe.js";
2
+ import { FluxCapacityError as t } from "../errors.js";
3
+ import { stream as n } from "../core.js";
4
+ import { link as r } from "../_link.js";
5
+ import { tryCall as i } from "../_safe.js";
5
6
  //#region src/operators/transformation.ts
6
- function i(e) {
7
- return (i) => t((t, a) => n(i, {
8
- complete: t.complete,
9
- error: t.error,
10
- next(n) {
11
- r(() => t.next(e(n)), t.error);
7
+ function a(e) {
8
+ return (t) => n((n, a) => r(t, {
9
+ complete: n.complete,
10
+ error: n.error,
11
+ next(t) {
12
+ i(() => n.next(e(t)), n.error);
12
13
  }
13
14
  }, a).unsubscribe);
14
15
  }
15
- function a(e) {
16
- return (i) => t((t, a) => n(i, {
17
- complete: t.complete,
18
- error: t.error,
19
- next(n) {
20
- r(() => {
21
- e(n) && t.next(n);
22
- }, t.error);
16
+ function o(e) {
17
+ return (t) => n((n, a) => r(t, {
18
+ complete: n.complete,
19
+ error: n.error,
20
+ next(t) {
21
+ i(() => {
22
+ e(t) && n.next(t);
23
+ }, n.error);
23
24
  }
24
25
  }, a).unsubscribe);
25
26
  }
26
- function o(e, i) {
27
- return (a) => t((t, o) => {
28
- let s = i;
29
- return n(a, {
30
- complete: t.complete,
31
- error: t.error,
32
- next(n) {
33
- r(() => {
34
- s = e(s, n), t.next(s);
35
- }, t.error);
27
+ function s(e, t) {
28
+ return (a) => n((n, o) => {
29
+ let s = t;
30
+ return r(a, {
31
+ complete: n.complete,
32
+ error: n.error,
33
+ next(t) {
34
+ i(() => {
35
+ s = e(s, t), n.next(s);
36
+ }, n.error);
36
37
  }
37
38
  }, o).unsubscribe;
38
39
  });
39
40
  }
40
- function s(e) {
41
- return (i) => t((t, a) => {
41
+ function c(e) {
42
+ return (t) => n((n, a) => {
42
43
  let o = !1, s, c = () => {
43
- o && !s && t.complete();
44
- }, l = n(i, {
44
+ o && !s && n.complete();
45
+ }, l = r(t, {
45
46
  complete() {
46
47
  o = !0, c();
47
48
  },
48
- error: t.error,
49
- next(i) {
50
- s?.unsubscribe(), s = void 0, r(() => {
51
- let r = n(e(i), {
49
+ error: n.error,
50
+ next(t) {
51
+ s?.unsubscribe(), s = void 0, i(() => {
52
+ let i = r(e(t), {
52
53
  complete() {
53
54
  s = void 0, c();
54
55
  },
55
- error: t.error,
56
- next: t.next
56
+ error: n.error,
57
+ next: n.next
57
58
  }, a);
58
- s = r.closed ? void 0 : r;
59
- }, t.error);
59
+ s = i.closed ? void 0 : i;
60
+ }, n.error);
60
61
  }
61
62
  }, a);
62
63
  return () => {
@@ -64,71 +65,60 @@ function s(e) {
64
65
  };
65
66
  });
66
67
  }
67
- function c(e) {
68
- return (i) => t((t, a) => {
69
- let o = !1, s = /* @__PURE__ */ new Set(), c = () => {
70
- o && s.size === 0 && t.complete();
71
- }, l = n(i, {
72
- complete() {
73
- o = !0, c();
74
- },
75
- error: t.error,
76
- next(i) {
77
- r(() => {
78
- let r = {};
79
- r.current = n(e(i), {
80
- complete() {
81
- r.current && s.delete(r.current), c();
82
- },
83
- error: t.error,
84
- next: t.next
85
- }, a), r.current.closed || s.add(r.current);
86
- }, t.error);
87
- }
88
- }, a);
89
- return () => {
90
- l.unsubscribe();
91
- for (let e of s) e.unsubscribe();
92
- };
93
- });
94
- }
95
- function l(i, a) {
96
- return e(a.capacity, "concatMap capacity"), (e) => t((t, o) => {
97
- let s = [], c = !1, l, u = {}, d = () => {
98
- if (l || s.length === 0) {
99
- c && !l && s.length === 0 && t.complete();
100
- return;
101
- }
102
- let e = s.shift();
103
- r(() => {
104
- let r = n(i(e), {
68
+ function l(a, o) {
69
+ let s = o.concurrency === Infinity;
70
+ return s || (e(o.concurrency, "mergeMap concurrency"), e(o.capacity, "mergeMap capacity")), (e) => n((n, c) => {
71
+ let l = [], u = /* @__PURE__ */ new Set(), d = !1, f = {}, p = () => {
72
+ d && u.size === 0 && l.length === 0 && n.complete();
73
+ }, m = (e) => {
74
+ i(() => {
75
+ let t = {};
76
+ t.current = r(a(e), {
105
77
  complete() {
106
- l = void 0, d();
78
+ t.current && u.delete(t.current), h();
107
79
  },
108
- error: t.error,
109
- next: t.next
110
- }, o);
111
- l = r.closed ? void 0 : r, l || d();
112
- }, t.error);
80
+ error: n.error,
81
+ next: n.next
82
+ }, c), t.current.closed ? h() : u.add(t.current);
83
+ }, n.error);
84
+ }, h = () => {
85
+ if (!c.aborted) {
86
+ for (; l.length > 0 && (s || u.size < o.concurrency);) {
87
+ let e = l.shift();
88
+ m(e);
89
+ }
90
+ p();
91
+ }
113
92
  };
114
- return u.current = n(e, {
93
+ return f.current = r(e, {
115
94
  complete() {
116
- c = !0, d();
95
+ d = !0, p();
117
96
  },
118
- error: t.error,
97
+ error: n.error,
119
98
  next(e) {
120
- if (s.length === a.capacity) {
121
- u.current?.unsubscribe(), t.error(/* @__PURE__ */ RangeError("concatMap buffer capacity exceeded"));
99
+ if (!s && l.length >= o.capacity) {
100
+ f.current?.unsubscribe(), n.error(new t(o.capacity, "mergeMap buffer capacity exceeded"));
122
101
  return;
123
102
  }
124
- s.push(e), d();
103
+ l.push(e), h();
125
104
  }
126
- }, o), () => {
127
- u.current?.unsubscribe(), l?.unsubscribe(), s.length = 0;
105
+ }, c), () => {
106
+ f.current?.unsubscribe();
107
+ for (let e of u) e.unsubscribe();
108
+ l.length = 0;
128
109
  };
129
110
  });
130
111
  }
112
+ function u(e, t) {
113
+ return l(e, t);
114
+ }
115
+ function d(e, t) {
116
+ return l(e, {
117
+ capacity: t.capacity,
118
+ concurrency: 1
119
+ });
120
+ }
131
121
  //#endregion
132
- export { l as concatMap, a as filter, i as map, c as mergeMap, o as scan, s as switchMap };
122
+ export { d as concatMap, o as filter, a as map, u as mergeMap, s as scan, c as switchMap };
133
123
 
134
124
  //# sourceMappingURL=transformation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transformation.js","names":[],"sources":["../../src/operators/transformation.ts"],"sourcesContent":["import { link } from '../_link';\nimport { assertPositiveInteger } from '../_numeric';\nimport { tryCall } from '../_safe';\nimport { stream } from '../core';\nimport type { Operator, Stream, Subscription } from '../types';\n\nexport type ConcatMapOptions = {\n capacity: number;\n};\n\nexport function map<A, B>(project: (value: A) => B): Operator<A, B> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => sink.next(project(value)), sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n if (predicate(value)) sink.next(value);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function scan<T, A>(reducer: (state: A, value: T) => A, initial: A): Operator<T, A> {\n return (source) =>\n stream((sink, signal) => {\n let state = initial;\n\n return link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n state = reducer(state, value);\n sink.next(state);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe;\n });\n}\n\nexport function switchMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n let inner: Subscription | undefined;\n\n const finish = (): void => {\n if (outerComplete && !inner) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n inner?.unsubscribe();\n inner = undefined;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n inner?.unsubscribe();\n };\n });\n}\n\nexport function mergeMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n const inners = new Set<Subscription>();\n\n const finish = (): void => {\n if (outerComplete && inners.size === 0) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n tryCall(() => {\n const innerRef: { current?: Subscription } = {};\n\n innerRef.current = link(\n project(value),\n {\n complete() {\n if (innerRef.current) inners.delete(innerRef.current);\n\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n if (!innerRef.current.closed) inners.add(innerRef.current);\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n for (const inner of inners) inner.unsubscribe();\n };\n });\n}\n\nexport function concatMap<A, B>(project: (value: A) => Stream<B>, options: ConcatMapOptions): Operator<A, B> {\n assertPositiveInteger(options.capacity, 'concatMap capacity');\n\n return (source) =>\n stream((sink, signal) => {\n const queue: A[] = [];\n let outerComplete = false;\n let inner: Subscription | undefined;\n const outerRef: { current?: Subscription } = {};\n\n const next = (): void => {\n if (inner || queue.length === 0) {\n if (outerComplete && !inner && queue.length === 0) sink.complete();\n\n return;\n }\n\n const value = queue.shift()!;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n next();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n\n if (!inner) next();\n }, sink.error);\n };\n\n outerRef.current = link(\n source,\n {\n complete() {\n outerComplete = true;\n next();\n },\n error: sink.error,\n next(value) {\n if (queue.length === options.capacity) {\n outerRef.current?.unsubscribe();\n sink.error(new RangeError('concatMap buffer capacity exceeded'));\n\n return;\n }\n\n queue.push(value);\n next();\n },\n },\n signal,\n );\n\n return () => {\n outerRef.current?.unsubscribe();\n inner?.unsubscribe();\n queue.length = 0;\n };\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transformation.js","names":[],"sources":["../../src/operators/transformation.ts"],"sourcesContent":["import { link } from '../_link.js';\nimport { assertPositiveInteger } from '../_numeric.js';\nimport { tryCall } from '../_safe.js';\nimport { stream } from '../core.js';\nimport { FluxCapacityError } from '../errors.js';\nimport type { Operator, Stream, Subscription } from '../types.js';\n\nexport type FlattenOptions = {\n /** Maximum concurrently active inner subscriptions. Use `Infinity` for unbounded concurrency. */\n concurrency: number;\n /** Maximum queued outer values waiting for an inner subscription slot. Required when `concurrency` is finite. */\n capacity: number;\n};\n\nexport function map<A, B>(project: (value: A) => B): Operator<A, B> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => sink.next(project(value)), sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return (source) =>\n stream(\n (sink, signal) =>\n link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n if (predicate(value)) sink.next(value);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe,\n );\n}\n\nexport function scan<T, A>(reducer: (state: A, value: T) => A, initial: A): Operator<T, A> {\n return (source) =>\n stream((sink, signal) => {\n let state = initial;\n\n return link(\n source,\n {\n complete: sink.complete,\n error: sink.error,\n next(value) {\n tryCall(() => {\n state = reducer(state, value);\n sink.next(state);\n }, sink.error);\n },\n },\n signal,\n ).unsubscribe;\n });\n}\n\nexport function switchMap<A, B>(project: (value: A) => Stream<B>): Operator<A, B> {\n return (source) =>\n stream((sink, signal) => {\n let outerComplete = false;\n let inner: Subscription | undefined;\n\n const finish = (): void => {\n if (outerComplete && !inner) sink.complete();\n };\n\n const outer = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n inner?.unsubscribe();\n inner = undefined;\n\n tryCall(() => {\n const subscription = link(\n project(value),\n {\n complete() {\n inner = undefined;\n finish();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n inner = subscription.closed ? undefined : subscription;\n }, sink.error);\n },\n },\n signal,\n );\n\n return () => {\n outer.unsubscribe();\n inner?.unsubscribe();\n };\n });\n}\n\nfunction flatten<A, B>(project: (value: A) => Stream<B>, options: FlattenOptions): Operator<A, B> {\n const unbounded = options.concurrency === Infinity;\n\n if (!unbounded) {\n assertPositiveInteger(options.concurrency, 'mergeMap concurrency');\n assertPositiveInteger(options.capacity, 'mergeMap capacity');\n }\n\n return (source) =>\n stream((sink, signal) => {\n const queue: A[] = [];\n const inners = new Set<Subscription>();\n let outerComplete = false;\n const outerRef: { current?: Subscription } = {};\n\n const finish = (): void => {\n if (outerComplete && inners.size === 0 && queue.length === 0) sink.complete();\n };\n\n const startInner = (value: A): void => {\n tryCall(() => {\n const innerRef: { current?: Subscription } = {};\n\n innerRef.current = link(\n project(value),\n {\n complete() {\n if (innerRef.current) inners.delete(innerRef.current);\n\n drain();\n },\n error: sink.error,\n next: sink.next,\n },\n signal,\n );\n\n if (!innerRef.current.closed) inners.add(innerRef.current);\n else drain();\n }, sink.error);\n };\n\n const drain = (): void => {\n if (signal.aborted) return;\n\n while (queue.length > 0 && (unbounded || inners.size < options.concurrency)) {\n const value = queue.shift()!;\n\n startInner(value);\n }\n\n finish();\n };\n\n outerRef.current = link(\n source,\n {\n complete() {\n outerComplete = true;\n finish();\n },\n error: sink.error,\n next(value) {\n if (!unbounded && queue.length >= options.capacity) {\n outerRef.current?.unsubscribe();\n sink.error(new FluxCapacityError(options.capacity, 'mergeMap buffer capacity exceeded'));\n\n return;\n }\n\n queue.push(value);\n drain();\n },\n },\n signal,\n );\n\n return () => {\n outerRef.current?.unsubscribe();\n for (const inner of inners) inner.unsubscribe();\n queue.length = 0;\n };\n });\n}\n\nexport function mergeMap<A, B>(project: (value: A) => Stream<B>, options: FlattenOptions): Operator<A, B> {\n return flatten(project, options);\n}\n\nexport function concatMap<A, B>(\n project: (value: A) => Stream<B>,\n options: Omit<FlattenOptions, 'concurrency'>,\n): Operator<A, B> {\n return flatten(project, { capacity: options.capacity, concurrency: 1 });\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("../_numeric.cjs"),t=require("../core.cjs"),n=require("../_link.cjs"),r=require("../_safe.cjs"),i=require("../_scheduler.cjs");function a(){return new DOMException(`Stream consumption aborted`,`AbortError`)}function o(a){return e.assertNonNegativeInteger(a.attempts,`retry attempts`),e=>t.stream((t,o)=>{let s=0,c,l,u=()=>{if(o.aborted)return;let d=n.link(e,{complete:t.complete,error(e){if(s===a.attempts){t.error(e);return}let n=s++,c;if(r.tryCall(()=>{c=typeof a.delay==`function`?a.delay(n):a.delay},t.error),!o.aborted){if(c!==void 0&&(!Number.isFinite(c)||c<0)){t.error(RangeError(`retry delay must be a finite number greater than or equal to zero`));return}c===void 0||c===0?queueMicrotask(u):l=i.defaultScheduler.delay(u,c)}},next:t.next},o);d.closed||(c=d)};return u(),()=>{l?.(),c?.unsubscribe()}})}function s(e,t){return new Promise((r,i)=>{let o=new AbortController,s=()=>{o.abort(),i(a())};if(t?.signal?.aborted){s();return}t?.signal?.addEventListener(`abort`,s,{once:!0}),n.link(e,{error(e){t?.signal?.removeEventListener(`abort`,s),i(e)},next(e){t?.signal?.removeEventListener(`abort`,s),o.abort(),r(e)}},o.signal)})}function c(e,t){return new Promise((r,i)=>{let o=()=>i(a()),s;if(t?.signal?.aborted){o();return}t?.signal?.addEventListener(`abort`,o,{once:!0}),n.link(e,{complete(){t?.signal?.removeEventListener(`abort`,o),r(s)},error(e){t?.signal?.removeEventListener(`abort`,o),i(e)},next(e){s=e}},t?.signal??new AbortController().signal)})}function l(t,r){return e.assertNonNegativeInteger(r.maxItems,`toArray maxItems`),new Promise((e,i)=>{let o=new AbortController,s=[],c=()=>{o.abort(),i(a())};if(r.signal?.aborted){c();return}r.signal?.addEventListener(`abort`,c,{once:!0}),n.link(t,{complete(){r.signal?.removeEventListener(`abort`,c),e(s)},error(e){r.signal?.removeEventListener(`abort`,c),i(e)},next(e){if(s.length===r.maxItems){r.signal?.removeEventListener(`abort`,c),o.abort(),i(RangeError(`toArray maxItems exceeded`));return}s.push(e)}},o.signal)})}exports.first=s,exports.last=c,exports.retry=o,exports.toArray=l;
1
+ const e=require("../_numeric.cjs"),t=require("../errors.cjs"),n=require("../core.cjs"),r=require("../_link.cjs"),i=require("../_scheduler.cjs"),a=require("../_safe.cjs");let o=require("@vielzeug/arsenal");function s(t){return e.assertNonNegativeInteger(t.attempts,`retry attempts`),o=>n.stream((n,s)=>{let c=0,l,u,d=()=>{if(s.aborted)return;let f=r.link(o,{complete:n.complete,error(r){if(c===t.attempts){n.error(r);return}let o=c++,l;if(a.tryCall(()=>{l=typeof t.delay==`function`?t.delay(o):t.delay},n.error),!s.aborted){if(l!==void 0)try{e.assertDuration(l,`Retry delay`)}catch(e){n.error(e);return}l===void 0||l===0?queueMicrotask(d):u=i.defaultScheduler.delay(d,l)}},next:n.next},s);f.closed||(l=f)};return d(),()=>{u?.(),l?.unsubscribe()}})}function c(e,n){return new Promise((i,a)=>{let s=new AbortController,c=()=>{s.abort(),a((0,o.abortError)(n?.signal,`Stream consumption aborted`))};if(n?.signal?.aborted){c();return}n?.signal?.addEventListener(`abort`,c,{once:!0}),r.link(e,{complete(){n?.signal?.removeEventListener(`abort`,c),`defaultValue`in(n??{})?i(n.defaultValue):a(new t.FluxEmptyError)},error(e){n?.signal?.removeEventListener(`abort`,c),a(e)},next(e){n?.signal?.removeEventListener(`abort`,c),s.abort(),i(e)}},s.signal)})}function l(e,n){return new Promise((i,a)=>{let s=new AbortController,c=()=>{s.abort(),a((0,o.abortError)(n?.signal,`Stream consumption aborted`))};if(n?.signal?.aborted){c();return}let l=!1,u;n?.signal?.addEventListener(`abort`,c,{once:!0}),r.link(e,{complete(){n?.signal?.removeEventListener(`abort`,c),l?i(u):`defaultValue`in(n??{})?i(n.defaultValue):a(new t.FluxEmptyError)},error(e){n?.signal?.removeEventListener(`abort`,c),a(e)},next(e){l=!0,u=e}},s.signal)})}function u(n,i){return e.assertNonNegativeInteger(i.maxItems,`toArray maxItems`),new Promise((e,a)=>{let s=new AbortController,c=[],l=()=>{s.abort(),a((0,o.abortError)(i?.signal,`Stream consumption aborted`))};if(i.signal?.aborted){l();return}i.signal?.addEventListener(`abort`,l,{once:!0}),r.link(n,{complete(){i.signal?.removeEventListener(`abort`,l),e(c)},error(e){i.signal?.removeEventListener(`abort`,l),a(e)},next(e){if(c.length===i.maxItems){i.signal?.removeEventListener(`abort`,l),s.abort(),a(new t.FluxCapacityError(i.maxItems,`toArray maxItems exceeded`));return}c.push(e)}},s.signal)})}exports.first=c,exports.last=l,exports.retry=s,exports.toArray=u;
2
2
  //# sourceMappingURL=utility.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utility.cjs","names":[],"sources":["../../src/operators/utility.ts"],"sourcesContent":["import { link } from '../_link';\nimport { assertNonNegativeInteger } from '../_numeric';\nimport { tryCall } from '../_safe';\nimport { defaultScheduler } from '../_scheduler';\nimport { stream } from '../core';\nimport type { Operator, Stream, Subscription } from '../types';\n\nexport type RetryOptions = {\n attempts: number;\n delay?: number | ((attempt: number) => number);\n};\n\nexport type ToArrayOptions = {\n maxItems: number;\n signal?: AbortSignal;\n};\n\nexport type ValueOptions = {\n signal?: AbortSignal;\n};\n\nfunction abortError(): DOMException {\n return new DOMException('Stream consumption aborted', 'AbortError');\n}\n\nexport function retry<T>(options: RetryOptions): Operator<T, T> {\n assertNonNegativeInteger(options.attempts, 'retry attempts');\n\n return (source) =>\n stream((sink, signal) => {\n let attempts = 0;\n let current: Subscription | undefined;\n let cancelDelay: (() => void) | undefined;\n\n const start = (): void => {\n if (signal.aborted) return;\n\n const subscription = link(\n source,\n {\n complete: sink.complete,\n error(reason) {\n if (attempts === options.attempts) {\n sink.error(reason);\n\n return;\n }\n\n const attempt = attempts++;\n let delay: number | undefined;\n\n tryCall(() => {\n delay = typeof options.delay === 'function' ? options.delay(attempt) : options.delay;\n }, sink.error);\n\n if (signal.aborted) return;\n\n if (delay !== undefined && (!Number.isFinite(delay) || delay < 0)) {\n sink.error(new RangeError('retry delay must be a finite number greater than or equal to zero'));\n\n return;\n }\n\n if (delay === undefined || delay === 0) {\n queueMicrotask(start);\n } else {\n cancelDelay = defaultScheduler.delay(start, delay);\n }\n },\n next: sink.next,\n },\n signal,\n );\n\n if (!subscription.closed) current = subscription;\n };\n\n start();\n\n return () => {\n cancelDelay?.();\n current?.unsubscribe();\n };\n });\n}\n\nexport function first<T>(source: Stream<T>, options?: ValueOptions): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort();\n reject(abortError());\n };\n\n if (options?.signal?.aborted) {\n abort();\n\n return;\n }\n\n options?.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n error(reason) {\n options?.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n options?.signal?.removeEventListener('abort', abort);\n controller.abort();\n resolve(value);\n },\n },\n controller.signal,\n );\n });\n}\n\nexport function last<T>(source: Stream<T>, options?: ValueOptions): Promise<T | undefined> {\n return new Promise<T | undefined>((resolve, reject) => {\n const abort = (): void => reject(abortError());\n let latest: T | undefined;\n\n if (options?.signal?.aborted) {\n abort();\n\n return;\n }\n\n options?.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n complete() {\n options?.signal?.removeEventListener('abort', abort);\n resolve(latest);\n },\n error(reason) {\n options?.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n latest = value;\n },\n },\n options?.signal ?? new AbortController().signal,\n );\n });\n}\n\nexport function toArray<T>(source: Stream<T>, options: ToArrayOptions): Promise<T[]> {\n assertNonNegativeInteger(options.maxItems, 'toArray maxItems');\n\n return new Promise<T[]>((resolve, reject) => {\n const controller = new AbortController();\n const values: T[] = [];\n const abort = (): void => {\n controller.abort();\n reject(abortError());\n };\n\n if (options.signal?.aborted) {\n abort();\n\n return;\n }\n\n options.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n complete() {\n options.signal?.removeEventListener('abort', abort);\n resolve(values);\n },\n error(reason) {\n options.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n if (values.length === options.maxItems) {\n options.signal?.removeEventListener('abort', abort);\n controller.abort();\n reject(new RangeError('toArray maxItems exceeded'));\n\n return;\n }\n\n values.push(value);\n },\n },\n controller.signal,\n );\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utility.cjs","names":[],"sources":["../../src/operators/utility.ts"],"sourcesContent":["import { abortError } from '@vielzeug/arsenal';\n\nimport { link } from '../_link.js';\nimport { assertDuration, assertNonNegativeInteger } from '../_numeric.js';\nimport { tryCall } from '../_safe.js';\nimport { defaultScheduler } from '../_scheduler.js';\nimport { stream } from '../core.js';\nimport { FluxCapacityError, FluxEmptyError } from '../errors.js';\nimport type { Operator, Stream, Subscription } from '../types.js';\n\nexport type RetryOptions = {\n attempts: number;\n delay?: number | ((attempt: number) => number);\n};\n\nexport type ToArrayOptions = {\n maxItems: number;\n signal?: AbortSignal;\n};\n\nexport type ValueOptions<T> = {\n signal?: AbortSignal;\n /** Resolved when the source completes empty instead of rejecting with `FluxEmptyError`. */\n defaultValue?: T;\n};\n\nexport function retry<T>(options: RetryOptions): Operator<T, T> {\n assertNonNegativeInteger(options.attempts, 'retry attempts');\n\n return (source) =>\n stream((sink, signal) => {\n let attempts = 0;\n let current: Subscription | undefined;\n let cancelDelay: (() => void) | undefined;\n\n const start = (): void => {\n if (signal.aborted) return;\n\n const subscription = link(\n source,\n {\n complete: sink.complete,\n error(reason) {\n if (attempts === options.attempts) {\n sink.error(reason);\n\n return;\n }\n\n const attempt = attempts++;\n let delay: number | undefined;\n\n tryCall(() => {\n delay = typeof options.delay === 'function' ? options.delay(attempt) : options.delay;\n }, sink.error);\n\n if (signal.aborted) return;\n\n if (delay !== undefined) {\n try {\n assertDuration(delay, 'Retry delay');\n } catch (reason) {\n sink.error(reason);\n return;\n }\n }\n\n if (delay === undefined || delay === 0) {\n queueMicrotask(start);\n } else {\n cancelDelay = defaultScheduler.delay(start, delay);\n }\n },\n next: sink.next,\n },\n signal,\n );\n\n if (!subscription.closed) current = subscription;\n };\n\n start();\n\n return () => {\n cancelDelay?.();\n current?.unsubscribe();\n };\n });\n}\n\nexport function first<T>(source: Stream<T>, options?: ValueOptions<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort();\n reject(abortError(options?.signal, 'Stream consumption aborted'));\n };\n\n if (options?.signal?.aborted) {\n abort();\n\n return;\n }\n\n options?.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n complete() {\n options?.signal?.removeEventListener('abort', abort);\n\n if ('defaultValue' in (options ?? {})) resolve(options!.defaultValue as T);\n else reject(new FluxEmptyError());\n },\n error(reason) {\n options?.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n options?.signal?.removeEventListener('abort', abort);\n controller.abort();\n resolve(value);\n },\n },\n controller.signal,\n );\n });\n}\n\nexport function last<T>(source: Stream<T>, options?: ValueOptions<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const controller = new AbortController();\n const abort = (): void => {\n controller.abort();\n reject(abortError(options?.signal, 'Stream consumption aborted'));\n };\n\n if (options?.signal?.aborted) {\n abort();\n\n return;\n }\n\n let emitted = false;\n let latest: T | undefined;\n\n options?.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n complete() {\n options?.signal?.removeEventListener('abort', abort);\n\n if (emitted) resolve(latest as T);\n else if ('defaultValue' in (options ?? {})) resolve(options!.defaultValue as T);\n else reject(new FluxEmptyError());\n },\n error(reason) {\n options?.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n emitted = true;\n latest = value;\n },\n },\n controller.signal,\n );\n });\n}\n\nexport function toArray<T>(source: Stream<T>, options: ToArrayOptions): Promise<T[]> {\n assertNonNegativeInteger(options.maxItems, 'toArray maxItems');\n\n return new Promise<T[]>((resolve, reject) => {\n const controller = new AbortController();\n const values: T[] = [];\n const abort = (): void => {\n controller.abort();\n reject(abortError(options?.signal, 'Stream consumption aborted'));\n };\n\n if (options.signal?.aborted) {\n abort();\n\n return;\n }\n\n options.signal?.addEventListener('abort', abort, { once: true });\n link(\n source,\n {\n complete() {\n options.signal?.removeEventListener('abort', abort);\n resolve(values);\n },\n error(reason) {\n options.signal?.removeEventListener('abort', abort);\n reject(reason);\n },\n next(value) {\n if (values.length === options.maxItems) {\n options.signal?.removeEventListener('abort', abort);\n controller.abort();\n reject(new FluxCapacityError(options.maxItems, 'toArray maxItems exceeded'));\n\n return;\n }\n\n values.push(value);\n },\n },\n controller.signal,\n );\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Operator, Stream } from '../types';
1
+ import type { Operator, Stream } from '../types.js';
2
2
  export type RetryOptions = {
3
3
  attempts: number;
4
4
  delay?: number | ((attempt: number) => number);
@@ -7,11 +7,13 @@ export type ToArrayOptions = {
7
7
  maxItems: number;
8
8
  signal?: AbortSignal;
9
9
  };
10
- export type ValueOptions = {
10
+ export type ValueOptions<T> = {
11
11
  signal?: AbortSignal;
12
+ /** Resolved when the source completes empty instead of rejecting with `FluxEmptyError`. */
13
+ defaultValue?: T;
12
14
  };
13
15
  export declare function retry<T>(options: RetryOptions): Operator<T, T>;
14
- export declare function first<T>(source: Stream<T>, options?: ValueOptions): Promise<T>;
15
- export declare function last<T>(source: Stream<T>, options?: ValueOptions): Promise<T | undefined>;
16
+ export declare function first<T>(source: Stream<T>, options?: ValueOptions<T>): Promise<T>;
17
+ export declare function last<T>(source: Stream<T>, options?: ValueOptions<T>): Promise<T>;
16
18
  export declare function toArray<T>(source: Stream<T>, options: ToArrayOptions): Promise<T[]>;
17
19
  //# sourceMappingURL=utility.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utility.d.ts","sourceRoot":"","sources":["../../src/operators/utility.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAgB,MAAM,UAAU,CAAC;AAE/D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAMF,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA2D9D;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,CA+B9E;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CA8BzF;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CA4CnF"}
1
+ {"version":3,"file":"utility.d.ts","sourceRoot":"","sources":["../../src/operators/utility.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAgB,MAAM,aAAa,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,2FAA2F;IAC3F,YAAY,CAAC,EAAE,CAAC,CAAC;CAClB,CAAC;AAEF,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CA8D9D;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAqCjF;AAED,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwChF;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CA4CnF"}