declare interface Read {
read(): Effect.Effect<boolean>;
}
declare interface Write extends Read {
write<A, E, R>(fa: Effect.Effect<A, E, R>): Effect.Effect<void, E, R>;
}
class ReadTx extends Context.Tag("ReadTx")<ReadTx, Read>() {}
class WriteTx extends Context.Tag("WriteTx")<WriteTx, Write>() {}
function prog(): Effect.Effect<[boolean, string], never, ReadTx | WriteTx> {
const read: Effect.Effect<boolean, never, ReadTx> = Effect.gen(function* () {
const readTx = yield* ReadTx;
return yield* readTx.read();
});
const write: Effect.Effect<string, never, WriteTx> = Effect.gen(function* () {
const writeTx = yield* WriteTx;
const a = yield* writeTx.read();
const b = yield* writeTx.write(Effect.succeed(a));
return "done";
});
return Effect.gen(function* () {
const a = yield* read;
const b = yield* write;
return [a, b];
});
}
declare interface Read {
read(): Effect.Effect<boolean>;
}
declare interface Write extends Read {
write<A, E, R>(fa: Effect.Effect<A, E, R>): Effect.Effect<void, E, R>;
}
class ReadTx extends Context.Tag("ReadTx")<ReadTx, Read>() {}
class WriteTx extends Context.Tag("WriteTx")<WriteTx, Write>() {}
function prog(): Effect.Effect<[boolean, string], never, ReadTx | WriteTx> {
const read: Effect.Effect<boolean, never, ReadTx> = Effect.gen(function* () {
const readTx = yield* ReadTx;
return yield* readTx.read();
});
const write: Effect.Effect<string, never, WriteTx> = Effect.gen(function* () {
const writeTx = yield* WriteTx;
const a = yield* writeTx.read();
const b = yield* writeTx.write(Effect.succeed(a));
return "done";
});
return Effect.gen(function* () {
const a = yield* read;
const b = yield* write;
return [a, b];
});
}