TodoRepository work
This commit is contained in:
@@ -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(),
|
||||||
|
}))
|
||||||
})
|
})
|
||||||
])
|
|
||||||
)
|
|
||||||
))
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user