Hyperlinkv0.8.0-beta.28

Store

Store.changesfunctionsrc/Store.ts:1028
<S extends StoreClassWithShapes, Row extends Schema.Schema<unknown>>(
  store: S,
  select: (shapes: ShapeRefs<ShapesOfStore<S>>) => ShapeRef<Row>
): Effect.Effect<
  Stream.Stream<SchemaDecoded<Row>, StoreJournalDecodeError>,
  never,
  Storage | Scope.Scope
>
<S extends StoreClassWithShapes>(store: S): Effect.Effect<
  Stream.Stream<AllShapeRows<ShapesOfStore<S>>, StoreJournalDecodeError>,
  never,
  Storage | Scope.Scope
>
(scope: string | StoreScopeTag): Effect.Effect<
  Stream.Stream<StoreChangeEvent, StoreJournalDecodeError>,
  StoreScopeNotRegistered,
  Storage | Scope.Scope
>

Stream store changes. Three forms:

  • changes(scope) — coarse firehose of StoreChangeEvents for a scope (string or tag).
  • changes(store) — decoded rows of every shape on the store (discriminated union).
  • changes(store, select) — decoded rows of the one shape the selector navigates to, e.g. changes(store, (shapes) => shapes.sensors.temperature).

Requires a Service.layer / store.layer that installed the scope bridge.

gettersStoreChangeEventService.layerstore.layer
Source src/Store.ts:102865 lines
export function changes<S extends StoreClassWithShapes, Row extends Schema.Schema<unknown>>(
  store: S,
  select: (shapes: ShapeRefs<ShapesOfStore<S>>) => ShapeRef<Row>,
): Effect.Effect<
  Stream.Stream<SchemaDecoded<Row>, StoreJournalDecodeError>,
  never,
  Storage | Scope.Scope
>;
export function changes<S extends StoreClassWithShapes>(
  store: S,
): Effect.Effect<
  Stream.Stream<AllShapeRows<ShapesOfStore<S>>, StoreJournalDecodeError>,
  never,
  Storage | Scope.Scope
>;
export function changes(
  scope: string | StoreScopeTag,
): Effect.Effect<
  Stream.Stream<StoreChangeEvent, StoreJournalDecodeError>,
  StoreScopeNotRegistered,
  Storage | Scope.Scope
>;
export function changes(
  storeOrScope: string | StoreScopeTag | StoreClassWithShapes,
  select?: (shapes: ShapeRefs<StoreShapes>) => ShapeRef<Schema.Schema<unknown>>,
): Effect.Effect<
  Stream.Stream<unknown, StoreJournalDecodeError, unknown>,
  StoreScopeNotRegistered,
  Storage | Scope.Scope
> {
  if (isStoreClassWithShapes(storeOrScope)) {
    const store = storeOrScope;
    if (select !== undefined) {
      const ref = resolveShapeRef(select(makeShapeRefs(store.contract.shapes)));
      return storeChangesStream(store).pipe(
        Effect.map((stream) =>
          stream.pipe(
            Stream.filter((event) => event.method === ref.shapeKey),
            Stream.mapEffect((event) => decodeChangeRow(ref.row, event.payload)),
          ),
        ),
      ) as any;
    }
    const rowByKey = shapeRowsByKey(store.contract.shapes);
    return storeChangesStream(store).pipe(
      Effect.map((stream) =>
        stream.pipe(
          Stream.mapEffect((event) => {
            const row = rowByKey.get(event.method);
            return row === undefined
              ? Effect.die(
                  new StoreJournalDecodeError({
                    cause: `no shape row schema registered for change method "${event.method}"`,
                    detail: "Store.changes(store)",
                  }),
                )
              : decodeChangeRow(row, event.payload);
          }),
        ),
      ),
    ) as any;
  }
  const key = typeof storeOrScope === "string" ? storeOrScope : storeOrScope.key;
  return Effect.flatMap(Storage, (bridge) => bridge.changes(key));
}