// ets_tracing: off import type * as CL from "../../../../Clock/index.js" import * as CK from "../../../../Collections/Immutable/Chunk/index.js" import * as T from "../../../../Effect/index.js" import * as SC from "../../../../Schedule/index.js" import * as CH from "../../Channel/index.js" import * as C from "../core.js" /** * Schedules the output of the stream using the provided `schedule` and emits its output at * the end (if `schedule` is finite). * Uses the provided function to align the stream and schedule outputs on the same type. */ export function scheduleWith_( self: C.Stream, schedule: SC.Schedule, f: (a: A) => C1, g: (b: B) => C2 ): C.Stream { const loop = ( driver: SC.Driver, chunk: CK.Chunk, index: number ): CH.Channel< R1 & CL.HasClock, E | E1, CK.Chunk, unknown, E | E1, CK.Chunk, any > => { if (index < CK.size(chunk)) { return CH.unwrap( T.suspend(() => { const a = CK.unsafeGet_(chunk, index) return T.foldM_( driver.next(a), () => T.zipLeft_( T.map_(T.orDie(driver.last), (b) => CH.zipRight_( CH.write(CK.make(f(a), g(b))), loop(driver, chunk, index + 1) ) ), driver.reset ), () => T.succeed( CH.zipRight_(CH.write(CK.single(f(a))), loop(driver, chunk, index + 1)) ) ) }) ) } else { return CH.readWithCause( (chunk) => loop(driver, chunk, 0), (_) => CH.failCause(_), (_) => CH.end(_) ) } } return new C.Stream( CH.chain_(CH.fromEffect(SC.driver(schedule)), (_) => self.channel[">>>"](loop(_, CK.empty(), 0)) ) ) } /** * Schedules the output of the stream using the provided `schedule` and emits its output at * the end (if `schedule` is finite). * Uses the provided function to align the stream and schedule outputs on the same type. * * @ets_data_first scheduleWith_ */ export function scheduleWith( schedule: SC.Schedule, f: (a: A) => C1, g: (b: B) => C2 ) { return (self: C.Stream) => scheduleWith_(self, schedule, f, g) }