0.1.0 #1

Merged
Thilawyn merged 81 commits from next into master 2025-07-17 21:17:57 +02:00
Showing only changes of commit 8bee721ca4 - Show all commits

View File

@@ -2,7 +2,6 @@ import { Todo } from "@/domain"
import { KeyValueStore } from "@effect/platform" import { KeyValueStore } from "@effect/platform"
import { BrowserKeyValueStore } from "@effect/platform-browser" import { BrowserKeyValueStore } from "@effect/platform-browser"
import { Chunk, Console, Effect, Option, Schema, Stream, SubscriptionRef } from "effect" import { Chunk, Console, Effect, Option, Schema, Stream, SubscriptionRef } from "effect"
import { SubscriptionSubRef } from "effect-fc/types"
export class TodosState extends Effect.Service<TodosState>()("TodosState", { export class TodosState extends Effect.Service<TodosState>()("TodosState", {
@@ -11,7 +10,7 @@ export class TodosState extends Effect.Service<TodosState>()("TodosState", {
const readFromLocalStorage = Console.log("Reading todos from local storage...").pipe( const readFromLocalStorage = Console.log("Reading todos from local storage...").pipe(
Effect.andThen(kv.get(key)), Effect.andThen(kv.get(key)),
Effect.flatMap(Option.match({ Effect.andThen(Option.match({
onSome: Schema.decode( onSome: Schema.decode(
Schema.parseJson(Schema.Chunk(Todo.TodoFromJson)) Schema.parseJson(Schema.Chunk(Todo.TodoFromJson))
), ),
@@ -22,7 +21,7 @@ export class TodosState extends Effect.Service<TodosState>()("TodosState", {
const saveToLocalStorage = (todos: Chunk.Chunk<Todo.Todo>) => Effect.andThen( const saveToLocalStorage = (todos: Chunk.Chunk<Todo.Todo>) => Effect.andThen(
Console.log("Saving todos to local storage..."), Console.log("Saving todos to local storage..."),
Chunk.isNonEmpty(todos) Chunk.isNonEmpty(todos)
? Effect.flatMap( ? Effect.andThen(
Schema.encode( Schema.encode(
Schema.parseJson(Schema.Chunk(Todo.TodoFromJson)) Schema.parseJson(Schema.Chunk(Todo.TodoFromJson))
)(todos), )(todos),
@@ -33,21 +32,16 @@ export class TodosState extends Effect.Service<TodosState>()("TodosState", {
const ref = yield* SubscriptionRef.make(yield* readFromLocalStorage) const ref = yield* SubscriptionRef.make(yield* readFromLocalStorage)
const makeSubRef = (index: number) => SubscriptionSubRef.makeFromGetSet(ref, {
get: parent => Chunk.unsafeGet(parent, index),
set: (parent, v) => Chunk.replace(parent, index, v),
})
yield* Effect.forkScoped(ref.changes.pipe( yield* Effect.forkScoped(ref.changes.pipe(
Stream.debounce("500 millis"), Stream.debounce("500 millis"),
Stream.runForEach(saveToLocalStorage), Stream.runForEach(saveToLocalStorage),
)) ))
yield* Effect.addFinalizer(() => ref.pipe( yield* Effect.addFinalizer(() => ref.pipe(
Effect.flatMap(saveToLocalStorage), Effect.andThen(saveToLocalStorage),
Effect.ignore, Effect.ignore,
)) ))
return { ref, makeSubRef } as const return { ref } as const
}), }),
dependencies: [BrowserKeyValueStore.layerLocalStorage], dependencies: [BrowserKeyValueStore.layerLocalStorage],