From fb9ce1bb674c35a5e6d0272617de8b7bf1f24098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Tue, 9 Jul 2024 00:12:22 +0200 Subject: [PATCH] Chunk instead of Array --- packages/server/src/TodoRepository.ts | 23 +++++++++++++---------- packages/server/src/rpc/routers/todos.ts | 12 ++++++++---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/server/src/TodoRepository.ts b/packages/server/src/TodoRepository.ts index d9eeeb0..7f423d7 100644 --- a/packages/server/src/TodoRepository.ts +++ b/packages/server/src/TodoRepository.ts @@ -1,5 +1,5 @@ import { Todo, type IdentifiedTodo } from "@todo-tests/common/data" -import { Array, Context, Data, Effect, Equal, Layer, Option, Order, Ref, SubscriptionRef, flow } from "effect" +import { Chunk, Context, Data, Effect, Equal, Layer, Option, Order, Ref, SubscriptionRef, flow } from "effect" import crypto from "node:crypto" @@ -7,7 +7,7 @@ export class TodoRepository extends Context.Tag("TodoRepository")()).pipe( + SubscriptionRef.make(Chunk.empty()).pipe( Effect.map(ref => new TodoRepositoryService(ref)) ) ) @@ -17,19 +17,19 @@ export module TodoRepository { export class TodoRepositoryService { constructor( - readonly todos: SubscriptionRef.SubscriptionRef + readonly todos: SubscriptionRef.SubscriptionRef> ) {} getByID(id: string) { return this.todos.get.pipe( - Effect.map(Array.findFirst(todo => Equal.equals(todo.id.value, id))) + Effect.map(Chunk.findFirst(todo => Equal.equals(todo.id.value, id))) ) } getIndexByID(id: string) { return this.todos.get.pipe( - Effect.map(Array.findFirstIndex(todo => Equal.equals(todo.id.value, id))) + Effect.map(Chunk.findFirstIndex(todo => Equal.equals(todo.id.value, id))) ) } @@ -42,7 +42,7 @@ export class TodoRepositoryService { const id: string = crypto.randomUUID() yield* Ref.update(this.todos, flow( - Array.append(new Todo({ + Chunk.append(new Todo({ ...todo, id: Option.some(id), }) as IdentifiedTodo), @@ -61,7 +61,7 @@ export class TodoRepositoryService { return yield* Effect.fail(new TodoHasNoID({ todo })) yield* Ref.update(this.todos, flow( - Array.replace( + Chunk.replace( yield* yield* this.getIndexByID(todo.id.value), todo as IdentifiedTodo, ), @@ -78,7 +78,7 @@ export class TodoRepositoryService { return yield* Effect.fail(new TodoHasNoID({ todo })) yield* Ref.update(this.todos, flow( - Array.remove( + Chunk.remove( yield* yield* this.getIndexByID(todo.id.value) ), updateTodosOrder, @@ -88,11 +88,14 @@ export class TodoRepositoryService { } -const sortTodos = Array.sortBy( +const sortTodos = Chunk.sort( Order.mapInput(Order.number, todo => todo.order) ) -const updateTodosOrder = Array.map((todo, order) => +const updateTodosOrder = Chunk.map< + Chunk.Chunk, + IdentifiedTodo +>((todo, order) => new Todo({ ...todo, order }, { disableValidation: true }) as IdentifiedTodo ) diff --git a/packages/server/src/rpc/routers/todos.ts b/packages/server/src/rpc/routers/todos.ts index d1dac18..07b4a8f 100644 --- a/packages/server/src/rpc/routers/todos.ts +++ b/packages/server/src/rpc/routers/todos.ts @@ -1,11 +1,15 @@ import { Schema as S } from "@effect/schema" import { JsonifiableTodo } from "@todo-tests/common/data" -import { Effect } from "effect" +import { Chunk, Effect } from "effect" import { TodoRepository } from "../../TodoRepository" import { TRPCBuilder } from "../../trpc/TRPCBuilder" import { RPCProcedureBuilder } from "../procedures/RPCProcedureBuilder" +const encodeTodos = S.encode(S.Array(JsonifiableTodo)) +const encodeOptionalTodo = S.encode(S.OptionFromNullOr(JsonifiableTodo)) + + export const todosRouter = Effect.gen(function*() { const t = yield* TRPCBuilder const procedure = yield* RPCProcedureBuilder @@ -15,8 +19,8 @@ export const todosRouter = Effect.gen(function*() { .query(({ ctx }) => ctx.run(Effect.gen(function*() { const todos = yield* TodoRepository - return yield* S.encode(S.Array(JsonifiableTodo))( - yield* todos.todos.get + return yield* encodeTodos( + Chunk.toReadonlyArray(yield* todos.todos.get) ) }))), @@ -25,7 +29,7 @@ export const todosRouter = Effect.gen(function*() { .query(({ ctx, input }) => ctx.run(Effect.gen(function*() { const todos = yield* TodoRepository - return yield* S.encode(S.OptionFromNullOr(JsonifiableTodo))( + return yield* encodeOptionalTodo( yield* todos.getByID(input) ) }))),