MCPcopy
hub / github.com/Effect-TS/effect / ScheduleDriverImpl

Class ScheduleDriverImpl

packages/effect/src/internal/schedule.ts:132–202  ·  view source on GitHub ↗

@internal

Source from the content-addressed store, hash-verified

130
131/** @internal */
132class ScheduleDriverImpl<Out, In, R> implements Schedule.ScheduleDriver<Out, In, R> {
133 [ScheduleDriverTypeId] = scheduleDriverVariance
134
135 constructor(
136 readonly schedule: Schedule.Schedule<Out, In, R>,
137 readonly ref: Ref.Ref<readonly [Option.Option<Out>, any]>
138 ) {}
139
140 get state(): Effect.Effect<unknown> {
141 return core.map(ref.get(this.ref), (tuple) => tuple[1])
142 }
143
144 get last(): Effect.Effect<Out, Cause.NoSuchElementException> {
145 return core.flatMap(ref.get(this.ref), ([element, _]) => {
146 switch (element._tag) {
147 case "None": {
148 return core.failSync(() => new core.NoSuchElementException())
149 }
150 case "Some": {
151 return core.succeed(element.value)
152 }
153 }
154 })
155 }
156
157 iterationMeta = ref.unsafeMake(defaultIterationMetadata)
158
159 get reset(): Effect.Effect<void> {
160 return ref.set(this.ref, [Option.none(), this.schedule.initial]).pipe(
161 core.zipLeft(ref.set(this.iterationMeta, defaultIterationMetadata))
162 )
163 }
164
165 next(input: In): Effect.Effect<Out, Option.Option<never>, R> {
166 return pipe(
167 core.map(ref.get(this.ref), (tuple) => tuple[1]),
168 core.flatMap((state) =>
169 pipe(
170 Clock.currentTimeMillis,
171 core.flatMap((now) =>
172 pipe(
173 core.suspend(() => this.schedule.step(now, input, state)),
174 core.flatMap(([state, out, decision]) => {
175 const setState = ref.set(this.ref, [Option.some(out), state] as const)
176 if (ScheduleDecision.isDone(decision)) {
177 return setState.pipe(
178 core.zipRight(core.fail(Option.none()))
179 )
180 }
181 const millis = Intervals.start(decision.intervals) - now
182 if (millis <= 0) {
183 return setState.pipe(
184 core.zipRight(updateInfo(this.iterationMeta, now, input, out)),
185 core.as(out)
186 )
187 }
188 const duration = Duration.millis(millis)
189 return pipe(

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected