From bcad9a71a0f5caa6f3eadf9d56e2a6db64ae547a Mon Sep 17 00:00:00 2001 From: Tim Date: Fri, 22 Sep 2023 11:21:42 +1200 Subject: [PATCH] add support for injecting initial values --- .changeset/cool-cycles-hammer.md | 5 +++ docs/rx/Registry.ts.md | 4 ++- docs/rx/Rx.ts.md | 48 ++++++++++++++++++---------- packages/rx/src/Registry.ts | 4 ++- packages/rx/src/Rx.ts | 20 ++++++++++-- packages/rx/src/internal/registry.ts | 11 +++++-- packages/rx/test/Rx.test.ts | 12 +++++++ 7 files changed, 82 insertions(+), 22 deletions(-) create mode 100644 .changeset/cool-cycles-hammer.md diff --git a/.changeset/cool-cycles-hammer.md b/.changeset/cool-cycles-hammer.md new file mode 100644 index 0000000..952fa53 --- /dev/null +++ b/.changeset/cool-cycles-hammer.md @@ -0,0 +1,5 @@ +--- +"@effect-rx/rx": patch +--- + +add support for injecting initial values diff --git a/docs/rx/Registry.ts.md b/docs/rx/Registry.ts.md index e9debb1..27fe526 100644 --- a/docs/rx/Registry.ts.md +++ b/docs/rx/Registry.ts.md @@ -29,7 +29,9 @@ Added in v1.0.0 **Signature** ```ts -export declare const make: () => Registry +export declare const make: ( + options?: { readonly initialValues: Iterable, any]> } | undefined +) => Registry ``` Added in v1.0.0 diff --git a/docs/rx/Rx.ts.md b/docs/rx/Rx.ts.md index ae504b3..b279fd5 100644 --- a/docs/rx/Rx.ts.md +++ b/docs/rx/Rx.ts.md @@ -12,7 +12,10 @@ Added in v1.0.0

Table of contents

+- [batching](#batching) + - [batch](#batch) - [combinators](#combinators) + - [initialValue](#initialvalue) - [keepAlive](#keepalive) - [refreshable](#refreshable) - [withLabel](#withlabel) @@ -57,13 +60,36 @@ Added in v1.0.0 - [TypeId (type alias)](#typeid-type-alias) - [WritableTypeId](#writabletypeid) - [WritableTypeId (type alias)](#writabletypeid-type-alias) -- [utils](#utils) - - [batch](#batch) --- +# batching + +## batch + +**Signature** + +```ts +export declare const batch: (f: () => void) => void +``` + +Added in v1.0.0 + # combinators +## initialValue + +**Signature** + +```ts +export declare const initialValue: { + (initialValue: A): (self: Rx) => readonly [Rx, A] + (self: Rx, initialValue: A): readonly [Rx, A] +} +``` + +Added in v1.0.0 + ## keepAlive **Signature** @@ -89,8 +115,10 @@ Added in v1.0.0 **Signature** ```ts -export declare const withLabel: ((name: string) => >(self: A) => A) & - (>(self: A, name: string) => >(self: A) => A) +export declare const withLabel: { + (name: string): >(self: A) => A + >(self: A, name: string): >(self: A) => A +} ``` Added in v1.0.0 @@ -563,15 +591,3 @@ export type WritableTypeId = typeof WritableTypeId ``` Added in v1.0.0 - -# utils - -## batch - -**Signature** - -```ts -export declare const batch: (f: () => void) => void -``` - -Added in v1.0.0 diff --git a/packages/rx/src/Registry.ts b/packages/rx/src/Registry.ts index ad2438c..9600a4b 100644 --- a/packages/rx/src/Registry.ts +++ b/packages/rx/src/Registry.ts @@ -33,4 +33,6 @@ export interface Registry { * @since 1.0.0 * @category constructors */ -export const make: () => Registry = internal.make +export const make: ( + options?: { readonly initialValues: Iterable, any]> } | undefined +) => Registry = internal.make diff --git a/packages/rx/src/Rx.ts b/packages/rx/src/Rx.ts index 1c16bb7..2269509 100644 --- a/packages/rx/src/Rx.ts +++ b/packages/rx/src/Rx.ts @@ -716,9 +716,12 @@ export const refreshable = >( * @since 1.0.0 * @category combinators */ -export const withLabel = dual< +export const withLabel: { + (name: string): >(self: A) => A + >(self: A, name: string): >(self: A) => A +} = dual< (name: string) => >(self: A) => A, - >(self: A, name: string) => >(self: A) => A + >(self: A, name: string) => A >(2, (self, name) => Object.assign(Object.create(Object.getPrototypeOf(self)), { ...self, @@ -727,5 +730,18 @@ export const withLabel = dual< /** * @since 1.0.0 + * @category combinators + */ +export const initialValue: { + (initialValue: A): (self: Rx) => readonly [Rx, A] + (self: Rx, initialValue: A): readonly [Rx, A] +} = dual< + (initialValue: A) => (self: Rx) => readonly [Rx, A], + (self: Rx, initialValue: A) => readonly [Rx, A] +>(2, (self, initialValue) => [self, initialValue]) + +/** + * @since 1.0.0 + * @category batching */ export const batch: (f: () => void) => void = internalRegistry.batch diff --git a/packages/rx/src/internal/registry.ts b/packages/rx/src/internal/registry.ts index 8715f72..f92655d 100644 --- a/packages/rx/src/internal/registry.ts +++ b/packages/rx/src/internal/registry.ts @@ -14,12 +14,19 @@ function constListener(_: any) {} export const TypeId: Registry.TypeId = Symbol.for("@effect-rx/rx/Registry") as Registry.TypeId /** @internal */ -export const make = (): Registry.Registry => new RegistryImpl() +export const make = (options?: { + readonly initialValues: Iterable, any]> +}): Registry.Registry => new RegistryImpl(options?.initialValues) class RegistryImpl implements Registry.Registry { readonly [TypeId]: Registry.TypeId - constructor() { + constructor(initialValues?: Iterable, any]>) { this[TypeId] = TypeId + if (initialValues !== undefined) { + for (const [rx, value] of initialValues) { + this.ensureNode(rx).setValue(value) + } + } } private readonly nodes = new Map, Node>() diff --git a/packages/rx/test/Rx.test.ts b/packages/rx/test/Rx.test.ts index 79e14ea..8d4e5b6 100644 --- a/packages/rx/test/Rx.test.ts +++ b/packages/rx/test/Rx.test.ts @@ -391,6 +391,18 @@ describe("Rx", () => { expect(count).toEqual(1) expect(r.get(derived)).toEqual("2b") }) + + it("initialValues", async () => { + const state = Rx.state(0) + const r = Registry.make({ + initialValues: [ + Rx.initialValue(state, 10) + ] + }) + expect(r.get(state)).toEqual(10) + await new Promise((resolve) => resolve(null)) + expect(r.get(state)).toEqual(0) + }) }) interface Counter {