{"_id":"@bemedev/rx-add-ons","_rev":"3-e9188050c6a8fd6416c9d8ce50516a90","name":"@bemedev/rx-add-ons","dist-tags":{"latest":"0.0.3"},"versions":{"0.0.1":{"name":"@bemedev/rx-add-ons","version":"0.0.1","keywords":["reactive","reactive programming","rxjs","operators","stream","observables","typescript","bemedev"],"author":{"url":"https://bemedev.vercel.app","name":"chlbri","email":"bri_lvi@icloud.com"},"license":"MIT","_id":"@bemedev/rx-add-ons@0.0.1","maintainers":[{"name":"bemedev","email":"bri_lvi@icloud.com"}],"contributors":[{"url":"https://bemedev.vercel.app","name":"chlbri","email":"bri_lvi@icloud.com"}],"homepage":"https://github.com/chlbri/rx-add-ons#readme","bugs":{"url":"https://github.com/chlbri/rx-add-ons/issues"},"dist":{"shasum":"9cba8591cfdc91ce52d3c06abfc87245d22eef9e","tarball":"https://registry.npmjs.org/@bemedev/rx-add-ons/-/rx-add-ons-0.0.1.tgz","fileCount":21,"integrity":"sha512-URhZkXa40C6DqedRbhG/MfKNu8nMBBEQqkebl9LqqbgBFP+C81iOE10QzaHkKqd42PfQt94iWkKj6rMytrHqTQ==","signatures":[{"sig":"MEQCICZumDgwYb8T8npVF/YXnCh2hSFMmlkw2g8YYkuuFeeSAiBKZgulhmDP7JAgn9kXmY+SjwNdSFhAjG776Co4mDpnEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22106},"main":"lib/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"lib/index.d.ts","module":"lib/index.js","engines":{"node":">=20"},"gitHead":"585acc8f0ac97efa2bf8e922592f79006adc08cb","scripts":{"ci":"pnpm run config:off && pnpm run lint && pnpm run test && pnpm run prettier && pnpm run p-q","rm":"pnpm run rimraf -- node_modules pnpm-lock.yaml","p-q":"pretty-quick","lint":"pnpm run prettier && pnpm run eslint --fix","size":"size-limit","test":"pnpm run test:coverage --no-coverage","build":"pnpm rm:lib && pnpm run rollup","clean":"pnpm run rm && pnpm run config","rinit":"pnpm run rm && pnpm run config","config":"pnpm install","eslint":"eslint \"{src/**/*,App}.{ts,tsx}\"","rimraf":"pnpx rimraf -rf","rm:lib":"pnpm run rimraf -- lib","rollup":"rollup -c","prepare":"husky","pretest":"pnpm run build","typings":"app-typings generate","upgrade":"pnpm upgrade --latest","ci:admin":"pnpm run rm && pnpm run upgrade && pnpm run ci","posttest":"pnpm run size","prettier":"prettier --write \"src/**/*.{ts,tsx}\"","rinit:off":"pnpm run rm && pnpm run config:off","config:off":"pnpm run config --offline","lint:watch":"onchange --await-write-finish 5500 \"**/*\" -- pnpm run lint","test:watch":"vitest","test:coverage":"vitest run","typings:watch":"pnpm run typings --watch","prepublishOnly":""},"_npmUser":{"name":"bemedev","email":"bri_lvi@icloud.com"},"repository":{"url":"git+https://github.com/chlbri/rx-add-ons.git","type":"git"},"size-limit":[{"path":"lib/*.js","limit":"10 KB"},{"path":"lib/*.cjs","limit":"10 KB"}],"_npmVersion":"10.8.2","description":"A collection of RxJS operators and utilities to enhance reactive programming capabilities.","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"glob":"^11.0.3","husky":"^9.1.7","tslib":"^2.8.1","eslint":"^9.36.0","rollup":"^4.52.2","vitest":"^3.2.4","globals":"^16.4.0","onchange":"^7.1.0","prettier":"^3.6.2","@eslint/js":"^9.36.0","size-limit":"^11.2.0","typescript":"^5.9.2","@types/node":"^24.5.2","@bemedev/fsf":"^0.8.0","pretty-quick":"^4.2.2","@bemedev/app-ts":"^1.0.4","@bemedev/app-cli":"^0.1.7","@eslint/eslintrc":"^3.3.1","@size-limit/file":"^11.2.0","@vitest/coverage-v8":"^3.2.4","@bemedev/vitest-alias":"^0.0.3","@bemedev/rollup-config":"^0.2.1","@bemedev/vitest-exclude":"^0.1.1","@bemedev/vitest-extended":"^1.5.3","@typescript-eslint/parser":"^8.44.1","@typescript-eslint/eslint-plugin":"^8.44.1"},"peerDependencies":{"rxjs":"^7.8.2"},"_npmOperationalInternal":{"tmp":"tmp/rx-add-ons_0.0.1_1758761234956_0.021626898310751264","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@bemedev/rx-add-ons","version":"0.0.2","keywords":["reactive","reactive programming","rxjs","operators","stream","observables","typescript","bemedev"],"author":{"url":"https://bemedev.vercel.app","name":"chlbri","email":"bri_lvi@icloud.com"},"license":"MIT","_id":"@bemedev/rx-add-ons@0.0.2","maintainers":[{"name":"bemedev","email":"bri_lvi@icloud.com"}],"contributors":[{"url":"https://bemedev.vercel.app","name":"chlbri","email":"bri_lvi@icloud.com"}],"homepage":"https://github.com/chlbri/rx-add-ons#readme","bugs":{"url":"https://github.com/chlbri/rx-add-ons/issues"},"dist":{"shasum":"88ea07037123b3b1a10c76d006d3443b3b65bc64","tarball":"https://registry.npmjs.org/@bemedev/rx-add-ons/-/rx-add-ons-0.0.2.tgz","fileCount":47,"integrity":"sha512-kWHzaontnkMI2xHVCc+qIDVE9RzIdj/zhWour7AqlI+koxeWfyH9aQysWcheeOPp7M2gtLW7eP+gWxf9AfFSAw==","signatures":[{"sig":"MEYCIQDVXoqhVOrPoVk18nFJajvuGPO/8goDxH0Ij49igZcSZwIhAP6SWTBQ5GUxnQc+gF/dFIYcvGl3hYEF4SPtAkp+As9L","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96194},"main":"lib/index.js","pnpm":{"onlyBuiltDependencies":["esbuild"]},"type":"module","types":"lib/index.d.ts","module":"lib/index.js","engines":{"node":">=20"},"gitHead":"12974313cc2b9dd0b2a4e2ebe3cc713377051302","scripts":{"ci":"pnpm run config:off && pnpm run lint && pnpm run test && pnpm run prettier && pnpm run p-q","rm":"pnpm run rimraf -- node_modules pnpm-lock.yaml","p-q":"pretty-quick","lint":"pnpm run prettier && pnpm run eslint --fix","size":"size-limit","test":"pnpm run test:coverage --no-coverage","build":"pnpm rm:lib && pnpm run rollup","clean":"pnpm run rm && pnpm run config","rinit":"pnpm run rm && pnpm run config","config":"pnpm install","eslint":"eslint \"{src/**/*,App}.{ts,tsx}\"","rimraf":"pnpx rimraf -rf","rm:lib":"pnpm run rimraf -- lib","rollup":"rollup -c","prepare":"husky","pretest":"pnpm run build","typings":"app-typings generate","upgrade":"pnpm upgrade --latest","ci:admin":"pnpm run rm && pnpm run upgrade && pnpm run ci","posttest":"pnpm run size","prettier":"prettier --write \"src/**/*.{ts,tsx}\"","rinit:off":"pnpm run rm && pnpm run config:off","config:off":"pnpm run config --offline","lint:watch":"onchange --await-write-finish 5500 \"**/*\" -- pnpm run lint","test:watch":"vitest","test:coverage":"vitest run","typings:watch":"pnpm run typings --watch","prepublishOnly":""},"_npmUser":{"name":"bemedev","email":"bri_lvi@icloud.com"},"repository":{"url":"git+https://github.com/chlbri/rx-add-ons.git","type":"git"},"size-limit":[{"path":"lib/*.js","limit":"10 KB"},{"path":"lib/*.cjs","limit":"10 KB"}],"_npmVersion":"10.8.2","description":"A collection of RxJS operators and utilities to enhance reactive programming capabilities.","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"glob":"^11.0.3","husky":"^9.1.7","tslib":"^2.8.1","eslint":"^9.36.0","rollup":"^4.52.2","vitest":"^3.2.4","globals":"^16.4.0","onchange":"^7.1.0","prettier":"^3.6.2","@eslint/js":"^9.36.0","size-limit":"^11.2.0","typescript":"^5.9.2","@types/node":"^24.5.2","@bemedev/fsf":"^0.8.0","pretty-quick":"^4.2.2","@bemedev/app-ts":"^1.0.4","@bemedev/app-cli":"^0.1.7","@eslint/eslintrc":"^3.3.1","@size-limit/file":"^11.2.0","@vitest/coverage-v8":"^3.2.4","@bemedev/vitest-alias":"^0.0.3","@bemedev/rollup-config":"^0.2.2","@bemedev/vitest-exclude":"^0.1.1","@bemedev/vitest-extended":"^1.5.3","@typescript-eslint/parser":"^8.44.1","@typescript-eslint/eslint-plugin":"^8.44.1"},"peerDependencies":{"rxjs":"^7.8.2"},"_npmOperationalInternal":{"tmp":"tmp/rx-add-ons_0.0.2_1758833909831_0.3150808951010651","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@bemedev/rx-add-ons","version":"0.0.3","description":"A collection of RxJS operators and utilities to enhance reactive programming capabilities.","author":{"name":"chlbri","email":"bri_lvi@icloud.com","url":"https://bemedev.vercel.app"},"repository":{"type":"git","url":"git+https://github.com/chlbri/rx-add-ons.git"},"license":"MIT","type":"module","main":"lib/index.js","types":"lib/index.d.ts","module":"lib/index.js","maintainers":[{"name":"bemedev","email":"bri_lvi@icloud.com"}],"contributors":[{"name":"chlbri","email":"bri_lvi@icloud.com","url":"https://bemedev.vercel.app"}],"keywords":["reactive","reactive programming","rxjs","operators","stream","observables","typescript","bemedev"],"engines":{"node":">=20"},"scripts":{"build":"pnpm rm:lib && pnpm run rollup","ci":"pnpm run config:off && pnpm run lint && pnpm run test && pnpm run prettier && pnpm run p-q","ci:admin":"pnpm run rm && pnpm run upgrade && pnpm run ci","clean":"pnpm run rm && pnpm run config","config":"pnpm install","config:off":"pnpm run config --offline","eslint":"eslint \"{src/**/*,App}.{ts,tsx}\"","lint":"pnpm run prettier && pnpm run eslint --fix","lint:watch":"onchange --await-write-finish 5500 \"**/*\" -- pnpm run lint","prepublishOnly":"","prepare":"husky","pretest":"pnpm run build","posttest":"pnpm run size","prettier":"prettier --write \"src/**/*.{ts,tsx}\"","p-q":"pretty-quick","rinit":"pnpm run rm && pnpm run config","rinit:off":"pnpm run rm && pnpm run config:off","rimraf":"pnpx rimraf -rf","rm":"pnpm run rimraf -- node_modules pnpm-lock.yaml","rm:lib":"pnpm run rimraf -- lib","rollup":"rollup -c","size":"size-limit","test":"pnpm run test:coverage --no-coverage","test:coverage":"vitest run","test:watch":"vitest","typings":"app-typings generate","typings:watch":"pnpm run typings --watch","upgrade":"pnpm upgrade --latest"},"size-limit":[{"path":"lib/*.js","limit":"10 KB"},{"path":"lib/*.cjs","limit":"10 KB"}],"devDependencies":{"@bemedev/app-cli":"^0.1.7","@bemedev/app-ts":"^1.0.4","@bemedev/fsf":"^0.8.0","@bemedev/rollup-config":"^0.2.2","@bemedev/vitest-alias":"^0.0.3","@bemedev/vitest-exclude":"^0.1.1","@bemedev/vitest-extended":"^1.5.3","@eslint/eslintrc":"^3.3.1","@eslint/js":"^9.36.0","@size-limit/file":"^11.2.0","@types/node":"^24.5.2","@typescript-eslint/eslint-plugin":"^8.44.1","@typescript-eslint/parser":"^8.44.1","@vitest/coverage-v8":"^3.2.4","eslint":"^9.36.0","glob":"^11.0.3","globals":"^16.4.0","husky":"^9.1.7","onchange":"^7.1.0","prettier":"^3.6.2","pretty-quick":"^4.2.2","rollup":"^4.52.2","size-limit":"^11.2.0","tslib":"^2.8.1","typescript":"^5.9.2","vitest":"^3.2.4"},"peerDependencies":{"rxjs":"^7.8.2"},"pnpm":{"onlyBuiltDependencies":["esbuild"]},"_id":"@bemedev/rx-add-ons@0.0.3","gitHead":"4d7b6686b123e25fa9ce82bb516200dca5cf8bb3","bugs":{"url":"https://github.com/chlbri/rx-add-ons/issues"},"homepage":"https://github.com/chlbri/rx-add-ons#readme","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-LtTCE6wzKE3iblXS0XmVn3K/lWwtNJIfT6XzxwqwB5/RKVphQmnLvNgsNRzbdv5lqOX1gIkAbOaoqEFsOaKHkg==","shasum":"b32366494bf19179ad4be444210afda9ccfa31a2","tarball":"https://registry.npmjs.org/@bemedev/rx-add-ons/-/rx-add-ons-0.0.3.tgz","fileCount":47,"unpackedSize":96194,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHIp09qyWHJL3J4igyHTGo33t3woNeHwdtXVzCF7a0CfAiEA1gyGYBqroRBLJDui5tvdskC6yXWoiZZoK/MqTagFVbI="}]},"_npmUser":{"name":"bemedev","email":"bri_lvi@icloud.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/rx-add-ons_0.0.3_1758834002093_0.7504904656747706"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-25T00:47:14.856Z","modified":"2025-09-25T21:00:02.509Z","0.0.1":"2025-09-25T00:47:15.188Z","0.0.2":"2025-09-25T20:58:30.016Z","0.0.3":"2025-09-25T21:00:02.300Z"},"bugs":{"url":"https://github.com/chlbri/rx-add-ons/issues"},"author":{"name":"chlbri","email":"bri_lvi@icloud.com","url":"https://bemedev.vercel.app"},"license":"MIT","homepage":"https://github.com/chlbri/rx-add-ons#readme","keywords":["reactive","reactive programming","rxjs","operators","stream","observables","typescript","bemedev"],"repository":{"type":"git","url":"git+https://github.com/chlbri/rx-add-ons.git"},"description":"A collection of RxJS operators and utilities to enhance reactive programming capabilities.","contributors":[{"name":"chlbri","email":"bri_lvi@icloud.com","url":"https://bemedev.vercel.app"}],"maintainers":[{"name":"bemedev","email":"bri_lvi@icloud.com"}],"readme":"# @bemedev/rx-add-ons\n\nA TypeScript library providing additional RxJS operators for enhanced\nreactive programming.\n\n<br/>\n\n## Installation\n\n```bash\nnpm install @bemedev/rx-add-ons\n# or\nyarn add @bemedev/rx-add-ons\n# or\npnpm add @bemedev/rx-add-ons\n```\n\n<br/>\n\n## Features\n\n- **Enhanced tap operators**: `tapWhile` with access to emission index and\n  accumulated values array\n- **Enhanced filter operators**: `filter` with predicate context (value,\n  index, all previous values)\n- **Enhanced skip operators**: `skipWhile` with accumulated values tracking\n- **Advanced timeout operators**: `timeoutWithFallback` and\n  `tickWithFallback` for graceful timeout handling without errors\n- **Time-based grouping**: `groupByTime` for windowed data collection with\n  optional buffer size limits\n- **Pausable observables**: `createPausable` for complete flow control\n  (start, stop, pause, resume)\n- Full TypeScript support with comprehensive type definitions\n- Lightweight and tree-shakable with internal RxJS imports\n- Enhanced operators provide access to emission index and accumulated\n  values array\n- Comprehensive test coverage\n\n<br/>\n\n## Documentation\n\n### `createPausable`(source$, observer?)\n\nCreates a pausable observable controller that provides complete flow\ncontrol over an observable stream.\n\n**Parameters:**\n\n- `source$: Observable<T>` - The source observable to control\n- `observer?: Partial<Observer<T>> | ((value: T) => void)` - Optional\n  observer or next callback\n\n**Returns:** Object with control methods:\n\n- `start(): void` - Start or restart the observable\n- `stop(): void` - Stop the observable completely\n- `pause(): void` - Pause emission (only when running)\n- `resume(): void` - Resume emission (only when paused)\n- `command(action): void` - Execute a command ('start' | 'stop' | 'pause' |\n  'resume')\n\n**Usage Examples:**\n\n```typescript\nimport { interval } from 'rxjs';\nimport { createPausable } from '@bemedev/rx-add-ons';\n\n// Basic usage with callback function\nconst source$ = interval(1000);\nconst controller = createPausable(source$, value => {\n  console.log('Received:', value);\n});\n\n// Control the observable\ncontroller.start(); // Start emitting values\ncontroller.pause(); // Pause emission\ncontroller.resume(); // Resume emission\ncontroller.stop(); // Stop completely\n\n// Or use the command method\ncontroller.command('start');\ncontroller.command('pause');\ncontroller.command('resume');\ncontroller.command('stop');\n\n// Usage with observer objects\nconst controller2 = createPausable(interval(1000), {\n  next: value => console.log('Next:', value),\n  error: err => console.error('Error:', err),\n  complete: () => console.log('Complete!'),\n});\n\ncontroller2.start();\n```\n\n<br/>\n\n### `filter`(predicate)\n\nEnhanced filter operator with access to emission index and accumulated\nvalues array.\n\n**Parameters:**\n\n- `predicate: (value: T, index: number, all: T[]) => boolean` - Function\n  that determines whether to emit the value\n  - `value: T` - The current emitted value\n  - `index: number` - The zero-based index of the current emission\n  - `all: T[]` - Array of all values emitted so far (including current)\n\n**Returns:** `(source: Observable<T>) => Observable<T>`\n\n**Usage Examples:**\n\n```typescript\nimport { of } from 'rxjs';\nimport { filter } from '@bemedev/rx-add-ons';\n\n// Enhanced filter with index and accumulated values\nof(1, 2, 3, 4, 5, 6)\n  .pipe(\n    filter((value, index, all) => {\n      // Filter even values only after index 2, and when we have at least 4 values\n      return index >= 2 && value % 2 === 0 && all.length >= 4;\n    }),\n  )\n  .subscribe(console.log);\n// Output: 4, 6\n\n// Filter based on accumulated values sum\nof(1, 2, 3, 4, 5)\n  .pipe(\n    filter((value, index, all) => {\n      const sum = all.reduce((acc, val) => acc + val, 0);\n      return sum <= 10; // Only emit while sum is <= 10\n    }),\n  )\n  .subscribe(console.log);\n// Output: 1, 2, 3, 4\n```\n\n<br/>\n\n### `groupByTime`(windowSize, maxBufferSize?)\n\nGroup emissions by time windows with optional buffer size limits.\n\n**Parameters:**\n\n- `windowSize: number` - Time window size in milliseconds\n- `maxBufferSize?: number` - Optional maximum buffer size\n\n**Returns:** `(source: Observable<T>) => Observable<T[]>`\n\n**Usage Examples:**\n\n```typescript\nimport { interval } from 'rxjs';\nimport { groupByTime } from '@bemedev/rx-add-ons';\n\n// Group emissions every 1000ms\ninterval(200).pipe(groupByTime(1000)).subscribe(console.log);\n// Output: [0, 1, 2, 3, 4], [5, 6, 7, 8, 9], ...\n\n// Group with maximum buffer size\ninterval(100).pipe(groupByTime(1000, 3)).subscribe(console.log);\n// Output: [0, 1, 2], [3, 4, 5], [6, 7, 8], ...\n```\n\n<br/>\n\n### `skipWhile`(predicate)\n\nEnhanced `skipWhile` operator that skips emitted values as long as the\npredicate returns true. Provides access to emission context.\n\n**Parameters:**\n\n- `predicate: (value: T, index: number, all: T[]) => boolean` - Function\n  that determines whether to continue skipping\n  - `value: T` - The current emitted value\n  - `index: number` - The zero-based index of the current emission\n  - `all: T[]` - Array of all values emitted so far (including current)\n\n**Returns:** `(source: Observable<T>) => Observable<T>`\n\n**Usage Examples:**\n\n```typescript\nimport { of } from 'rxjs';\nimport { skipWhile } from '@bemedev/rx-add-ons';\n\n// Skip while condition with index and accumulated values\nof(1, 2, 3, 4, 5, 6)\n  .pipe(\n    skipWhile((value, index, all) => {\n      // Skip while value is less than 4 and we're still at early indices\n      return value < 4 && index < 3 && all.length < 5;\n    }),\n  )\n  .subscribe(console.log);\n// Output: 4, 5, 6\n\n// Skip while sum of accumulated values is less than 10\nof(1, 2, 3, 4, 5)\n  .pipe(\n    skipWhile((value, _index, all) => {\n      const sum = all.reduce((acc, val) => acc + val, 0);\n      return sum < 10;\n    }),\n  )\n  .subscribe(console.log);\n// Output: 4, 5\n```\n\n<br/>\n\n### `tapWhile`(predicate, sideEffect)\n\nEnhanced RxJS operator that executes a side effect only when the predicate\nreturns true. The predicate and side effect functions receive additional\ncontext about the emission.\n\n**Parameters:**\n\n- `predicate: (value: T, index: number, all: T[]) => boolean` - Function\n  that determines whether to execute the side effect\n  - `value: T` - The current emitted value\n  - `index: number` - The zero-based index of the current emission\n  - `all: T[]` - Array of all values emitted so far (including current)\n- `sideEffect: (value: T, index: number, all: T[]) => void` - Function to\n  execute when predicate returns true\n  - Same parameters as predicate function\n\n**Returns:** `(source: Observable<T>) => Observable<T>`\n\n**Usage Examples:**\n\n```typescript\nimport { of } from 'rxjs';\nimport { tapWhile } from '@bemedev/rx-add-ons';\n\n// Basic conditional side effect\nof(1, 2, 3, 4, 5)\n  .pipe(\n    tapWhile(\n      value => value > 3, // predicate\n      value => console.log('Value is greater than 3:', value), // side effect\n    ),\n  )\n  .subscribe();\n// Output:\n// Value is greater than 3: 4\n// Value is greater than 3: 5\n\n// Enhanced tapWhile with index and accumulated values\nof('a', 'b', 'c', 'd')\n  .pipe(\n    tapWhile(\n      (value, index, all) => index < 2 && all.length <= 3,\n      (value, index, all) =>\n        console.log(`${value} at index ${index}, total: ${all.length}`),\n    ),\n  )\n  .subscribe();\n// Output:\n// a at index 0, total: 1\n// b at index 1, total: 2\n```\n\n<br/>\n\n### `tickWithFallback`(timeout, fallback), alias `tick`\n\nSwitch to fallback Observable on timeout, with timeout reset on each\nemission. Unlike `timeoutWithFallback`, this operator resets the timeout\ncounter each time the source emits a value.\n\n**Parameters:**\n\n- `timeout: number` - Timeout duration in milliseconds (resets on each\n  emission)\n- `fallback: Observable<T>` - Observable to switch to on timeout\n\n**Returns:** `(source: Observable<T>) => Observable<T>`\n\n**Usage Examples:**\n\n```typescript\nimport { interval, of } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { tickWithFallback } from '@bemedev/rx-add-ons';\n\n// Reset timeout on each emission\ninterval(2000)\n  .pipe(take(3), tickWithFallback(3000, of('timeout')))\n  .subscribe(console.log);\n// Output: 0, 1, 2 (timeout resets on each emission)\n\n// If source stops emitting, fallback kicks in\ninterval(5000) // Emits every 5 seconds\n  .pipe(\n    take(1),\n    tickWithFallback(3000, of('timeout')), // 3 second timeout\n  )\n  .subscribe(console.log);\n// Output: 'timeout' (because source takes 5s but timeout is 3s)\n```\n\n<br/>\n\n### `timeoutWithFallback`(timeout, fallback), alias `timeout`\n\nSwitch to fallback Observable on timeout without throwing errors.\n\n**Parameters:**\n\n- `timeout: number` - Timeout duration in milliseconds\n- `fallback: Observable<T>` - Observable to switch to on timeout\n\n**Returns:** `(source: Observable<T>) => Observable<T>`\n\n**Usage Examples:**\n\n```typescript\nimport { timer, of } from 'rxjs';\nimport { timeoutWithFallback } from '@bemedev/rx-add-ons';\n\n// Switch to fallback after 5 seconds\ntimer(10000) // Emits after 10 seconds\n  .pipe(timeoutWithFallback(5000, of('timeout')))\n  .subscribe(console.log);\n// Output: 'timeout' (after 5 seconds)\n\n// Source emits before timeout\ntimer(3000) // Emits after 3 seconds\n  .pipe(timeoutWithFallback(5000, of('timeout')))\n  .subscribe(console.log);\n// Output: 0 (after 3 seconds)\n```\n\n<br/>\n\n## CHANGE_LOG\n\n<details>\n\n<summary>\nView changelog\n</summary>\n\n### Version [0.0.2] --> 25 septembre 2025\n\n- ✨ Ajout de 5 opérateurs RxJS personnalisés\n- 🎯 Ajout de l'opérateur `tapWhile` - exécution conditionnelle d'effets de\n  bord avec accès au contexte\n- 🔍 Ajout de l'opérateur `filter` - filtrage avancé avec accès à l'index\n  et aux valeurs accumulées\n- ⏭️ Ajout de l'opérateur `skipWhile` - saut conditionnel avec logique\n  contextuelle\n- ⏰ Ajout de l'opérateur `timeoutWithFallback` - timeout avec basculement\n  sans erreur\n- ⏰ Ajout de l'opérateur `tickWithFallback` - timeout qui se remet à zéro\n  à chaque émission\n- 📊 Ajout de l'opérateur `groupByTime` - groupement par fenêtres\n  temporelles\n- 🎮 Ajout de la fonction `createPausable` - contrôle complet du flux\n  (start, stop, pause, resume)\n- 🧪 Tests complets pour tous les opérateurs\n- 📚 Documentation complète avec exemples d'utilisation\n\n### Version [0.0.1] --> 25 septembre 2025\n\n- ✨ Première version de la bibliothèque\n- 🎯 Ajout de l'opérateur `tapWhile`\n- 🎮 Ajout de la fonction `createPausable`\n- 🧪 Tests complets avec couverture de code\n- 📚 Documentation complète avec exemples\n\n</details>\n\n<br/>\n\n## Contributing\n\nContributions are welcome! Please read our contribution guide for details.\n\n<br/>\n\n## License\n\nMIT\n\n<br/>\n\n## Auteur\n\nchlbri (bri_lvi@icloud.com)\n\n[My github](https://github.com/chlbri?tab=repositories)\n\n[<svg width=\"98\" height=\"96\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z\" fill=\"#24292f\"/></svg>](https://github.com/chlbri?tab=repositories)\n\n<br/>\n\n## Liens\n\n- [Documentation](https://github.com/chlbri/rx-add-ons)\n","readmeFilename":"README.md"}