TodoRepository work

This commit is contained in:
Julien Valverdé
2024-06-28 22:51:21 +02:00
parent ade042e5b1
commit 5388bc139d
2 changed files with 27 additions and 28 deletions

View File

@@ -1,8 +1,14 @@
import { Todo } from "@todo-tests/common/data" import { Todo } from "@todo-tests/common/data"
import { Array, Context, Data, Effect, Option, Ref, SubscriptionRef } from "effect" import { Array, Context, Data, Effect, Layer, Option, Ref, SubscriptionRef } from "effect"
export class TodoRepository extends Context.Tag("TodoRepository")<TodoRepository, Ref.Ref<Todo[]>>() {} export class TodoRepository extends Context.Tag("TodoRepository")<TodoRepository, TodoRepositoryService>() {}
export const TodoRepositoryLive = Layer.effect(TodoRepository,
SubscriptionRef.make(Array.empty<Todo & { id: Option.Some<string> }>()).pipe(
Effect.map(ref => new TodoRepositoryService(ref))
)
)
export class TodoRepositoryService { export class TodoRepositoryService {
@@ -60,27 +66,20 @@ export class TodoRepositoryService {
} }
} }
export class TodoHasID extends Data.TaggedError("TodoHasID")<{ export class TodoHasID extends Data.TaggedError("TodoHasID")<{ todo: Todo }> {}
todo: Todo export class TodoHasNoID extends Data.TaggedError("TodoHasNoID")<{ todo: Todo }> {}
}> {}
export class TodoHasNoID extends Data.TaggedError("TodoHasNoID")<{
todo: Todo
}> {}
export const createDefaultTodos = TodoRepository.pipe(Effect.flatMap(repo => export const createDefaultTodos = Effect.gen(function*() {
Ref.update(repo, todos => const todos = yield* TodoRepository
Array.appendAll(todos, [
new Todo({ yield* todos.add(new Todo({
id: Option.some("1"), id: Option.none(),
title: "A test todo", title: "A test todo",
content: "Lorem ipsum", content: "Lorem ipsum",
due: Option.none(), due: Option.none(),
completed: false, completed: false,
createdAt: new Date(), createdAt: new Date(),
updatedAt: new Date(), updatedAt: new Date(),
}) }))
]) })
)
))

View File

@@ -1,17 +1,17 @@
import { BunRuntime } from "@effect/platform-bun" import { BunRuntime } from "@effect/platform-bun"
import { Array, Effect, Ref } from "effect" import { Effect } from "effect"
import { TodoRepository, createDefaultTodos } from "./TodoRepository" import { TodoRepository, TodoRepositoryLive, createDefaultTodos } from "./TodoRepository"
const main = Effect.gen(function*() { const main = Effect.gen(function*() {
yield* createDefaultTodos yield* createDefaultTodos
const todos = yield* TodoRepository const todos = yield* TodoRepository
console.log(yield* Ref.get(todos)) console.log(yield* todos.ref.get)
}) })
const runnableMain = main.pipe( const runnableMain = main.pipe(
Effect.provideServiceEffect(TodoRepository, Ref.make(Array.empty())) Effect.provide(TodoRepositoryLive)
) )
BunRuntime.runMain(runnableMain) BunRuntime.runMain(runnableMain)