MCPcopy Create free account
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

Used in the wild real call sites across dependent graphs

searching dependent graphs…