0.1.0 #1
@@ -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],
|
||||||
|
|||||||
Reference in New Issue
Block a user