{"version":3,"file":"groupByTime.cjs","sources":["../src/groupByTime.ts"],"sourcesContent":["import { Observable } from 'rxjs';\nimport { timer } from 'rxjs/internal/observable/timer';\nimport { buffer } from 'rxjs/internal/operators/buffer';\nimport { filter } from 'rxjs/internal/operators/filter';\nimport { share } from 'rxjs/internal/operators/share';\n\n/**\n * Groups emissions by time windows. Emits arrays of values collected within each time window.\n *\n * @param min - Time window size in milliseconds\n * @param max - Optional maximum buffer size (defaults to no limit)\n * @returns A function that returns an Observable that emits arrays of grouped values\n *\n * @example\n * ```typescript\n * // Group emissions every 1000ms\n * source$.pipe(groupByTime(1000))\n *\n * // Group emissions every 500ms with max 10 items per group\n * source$.pipe(groupByTime(500, 10))\n * ```\n */\nexport function groupByTime<T>(\n  min: number,\n  max?: number,\n): (source: Observable<T>) => Observable<T[]> {\n  return (source: Observable<T>) => {\n    const shared = source.pipe(share());\n\n    if (max) {\n      return new Observable<T[]>(subscriber => {\n        let buffer: T[] = [];\n        let windowStart = Date.now();\n\n        const sourceSubscription = shared.subscribe({\n          next: value => {\n            buffer.push(value);\n\n            // Check if buffer is full or window time has passed\n            const now = Date.now();\n            if (buffer.length >= max || now - windowStart >= min) {\n              if (buffer.length > 0) {\n                subscriber.next([...buffer]);\n                buffer = [];\n                windowStart = now;\n              }\n            }\n          },\n          error: err => {\n            if (buffer.length > 0) {\n              subscriber.next([...buffer]);\n              buffer = [];\n              windowStart = Date.now();\n            }\n            subscriber.error(err);\n          },\n          complete: () => {\n            // Emit remaining buffer on completion\n            if (buffer.length > 0) {\n              subscriber.next([...buffer]);\n            }\n            subscriber.complete();\n          },\n        });\n\n        return sourceSubscription.unsubscribe;\n      });\n    }\n\n    const trigger = timer(min, min);\n\n    // Simple time-based grouping without buffer size limit\n    return shared.pipe(\n      buffer(trigger),\n      filter(group => group.length > 0), // Only emit non-empty groups\n    );\n  };\n}\n"],"names":["share","Observable","timer","buffer","filter"],"mappings":";;;;;;;;AAMA;;;;;;;;;;;;;;;AAeG;AACG,SAAU,WAAW,CACzB,GAAW,EACX,GAAY,EAAA;IAEZ,OAAO,CAAC,MAAqB,KAAI;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAACA,WAAK,EAAE,CAAC;QAEnC,IAAI,GAAG,EAAE;AACP,YAAA,OAAO,IAAIC,eAAU,CAAM,UAAU,IAAG;gBACtC,IAAI,MAAM,GAAQ,EAAE;AACpB,gBAAA,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;AAE5B,gBAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC1C,IAAI,EAAE,KAAK,IAAG;AACZ,wBAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGlB,wBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,wBAAA,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,GAAG,WAAW,IAAI,GAAG,EAAE;AACpD,4BAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gCACrB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;gCAC5B,MAAM,GAAG,EAAE;gCACX,WAAW,GAAG,GAAG;4BACnB;wBACF;oBACF,CAAC;oBACD,KAAK,EAAE,GAAG,IAAG;AACX,wBAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;4BACrB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;4BAC5B,MAAM,GAAG,EAAE;AACX,4BAAA,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;wBAC1B;AACA,wBAAA,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC;oBACvB,CAAC;oBACD,QAAQ,EAAE,MAAK;;AAEb,wBAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;4BACrB,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;wBAC9B;wBACA,UAAU,CAAC,QAAQ,EAAE;oBACvB,CAAC;AACF,iBAAA,CAAC;gBAEF,OAAO,kBAAkB,CAAC,WAAW;AACvC,YAAA,CAAC,CAAC;QACJ;QAEA,MAAM,OAAO,GAAGC,WAAK,CAAC,GAAG,EAAE,GAAG,CAAC;;QAG/B,OAAO,MAAM,CAAC,IAAI,CAChBC,aAAM,CAAC,OAAO,CAAC,EACfC,aAAM,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAClC;AACH,IAAA,CAAC;AACH;;;;"}