Effect.gen(function* () {
yield* Effect.log("Start game");
yield* Effect.fork(
Effect.gen(function* () {
const repeat: Effect.Effect<void> = Effect.asyncEffect<
void,
never,
never,
never,
never,
never
>((resume) =>
Effect.gen(function* () {
const lastTime = yield* lastTimeRef.get;
window.requestAnimationFrame((time) => {
if (lastTime !== null) {
const delta = time - lastTime;
resume(loop(delta, { ctx, canvas }));
}
resume(Ref.update(lastTimeRef, () => time));
});
})
).pipe(
Effect.flatMap(() => Effect.yieldNow()),
Effect.flatMap(() => repeat)
);
yield* repeat;
})
);
yield* Effect.never;
yield* Effect.addFinalizer(() => Effect.log("Game over"));
});
Effect.gen(function* () {
yield* Effect.log("Start game");
yield* Effect.fork(
Effect.gen(function* () {
const repeat: Effect.Effect<void> = Effect.asyncEffect<
void,
never,
never,
never,
never,
never
>((resume) =>
Effect.gen(function* () {
const lastTime = yield* lastTimeRef.get;
window.requestAnimationFrame((time) => {
if (lastTime !== null) {
const delta = time - lastTime;
resume(loop(delta, { ctx, canvas }));
}
resume(Ref.update(lastTimeRef, () => time));
});
})
).pipe(
Effect.flatMap(() => Effect.yieldNow()),
Effect.flatMap(() => repeat)
);
yield* repeat;
})
);
yield* Effect.never;
yield* Effect.addFinalizer(() => Effect.log("Game over"));
});