37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import { Array as Arr, Context, Effect, Layer, Ref } from "effect"
|
|
|
|
export interface TestAction {
|
|
readonly command: string
|
|
readonly details: Record<string, unknown>
|
|
}
|
|
|
|
export class TestActions extends Context.Service<TestActions, {
|
|
readonly log: (action: TestAction) => Effect.Effect<void>
|
|
readonly getActions: Effect.Effect<ReadonlyArray<TestAction>>
|
|
}>()("TestActions") {}
|
|
|
|
const make = Effect.gen(function*() {
|
|
const actions = yield* Ref.make<ReadonlyArray<TestAction>>([])
|
|
return TestActions.of({
|
|
getActions: Ref.get(actions),
|
|
log: (action) => Ref.update(actions, Arr.append(action))
|
|
})
|
|
})
|
|
|
|
export const layer = Layer.effect(TestActions, make)
|
|
|
|
export const logAction = (
|
|
command: string,
|
|
details: Record<string, unknown> = {}
|
|
): Effect.Effect<void, never, TestActions> =>
|
|
Effect.flatMap(
|
|
TestActions,
|
|
(actions) => actions.log({ command, details })
|
|
)
|
|
|
|
export const getActions: Effect.Effect<
|
|
ReadonlyArray<TestAction>,
|
|
never,
|
|
TestActions
|
|
> = Effect.flatMap(TestActions, (actions) => actions.getActions)
|