diff --git a/packages/dataverse-experiments/src/Atom.ts b/packages/dataverse-experiments/src/Atom.ts index 8277687..784764b 100644 --- a/packages/dataverse-experiments/src/Atom.ts +++ b/packages/dataverse-experiments/src/Atom.ts @@ -175,8 +175,8 @@ export const valueDerivation =

>( ): IDerivation

? T : void> => { const meta = getPointerMeta(pointer) - let derivation = identityDerivationWeakMap.get(meta) - if (!derivation) { + let pr = identityDerivationWeakMap.get(meta) + if (!pr) { const root = meta.root if (!(root instanceof Atom)) { throw new Error( @@ -184,13 +184,13 @@ export const valueDerivation =

>( ) } const {path} = meta - derivation = new DerivationFromSource<$IntentionalAny>( + pr = new DerivationFromSource<$IntentionalAny>( (listener) => root.onPathValueChange(path, listener), () => root.getIn(path), ) - identityDerivationWeakMap.set(meta, derivation) + identityDerivationWeakMap.set(meta, pr) } - return derivation as $IntentionalAny + return pr as $IntentionalAny } export const val =

( diff --git a/packages/dataverse/src/Atom.ts b/packages/dataverse/src/Atom.ts index ade5787..a6b1266 100644 --- a/packages/dataverse/src/Atom.ts +++ b/packages/dataverse/src/Atom.ts @@ -20,7 +20,7 @@ enum ValueTypes { } /** - * Interface for objects that can provide a derivation at a certain path. + * Interface for objects that can provide a prism at a certain path. */ export interface IdentityPrismProvider { /** @@ -30,9 +30,9 @@ export interface IdentityPrismProvider { */ readonly $$isIdentityPrismProvider: true /** - * Returns a derivation of the value at the provided path. + * Returns a prism of the value at the provided path. * - * @param path - The path to create the derivation at. + * @param path - The path to create the prism at. */ getIdentityPrism(path: Array): Prism } @@ -240,9 +240,9 @@ export default class Atom implements IdentityPrismProvider { } /** - * Returns a new derivation of the value at the provided path. + * Returns a new prism of the value at the provided path. * - * @param path - The path to create the derivation at. + * @param path - The path to create the prism at. */ getIdentityPrism(path: Array): Prism { const subscribe = (listener: (val: unknown) => void) => @@ -259,18 +259,18 @@ export default class Atom implements IdentityPrismProvider { const identifyPrismWeakMap = new WeakMap<{}, Prism>() /** - * Returns a derivation of the value at the provided pointer. Derivations are + * Returns a prism of the value at the provided pointer. Prisms are * cached per pointer. * - * @param pointer - The pointer to return the derivation at. + * @param pointer - The pointer to return the prism at. */ export const pointerToPrism =

>( pointer: P, ): Prism

? T : void> => { const meta = getPointerMeta(pointer) - let derivation = identifyPrismWeakMap.get(meta) - if (!derivation) { + let prismInstance = identifyPrismWeakMap.get(meta) + if (!prismInstance) { const root = meta.root if (!isIdentityPrismProvider(root)) { throw new Error( @@ -278,10 +278,10 @@ export const pointerToPrism =

>( ) } const {path} = meta - derivation = root.getIdentityPrism(path) - identifyPrismWeakMap.set(meta, derivation) + prismInstance = root.getIdentityPrism(path) + identifyPrismWeakMap.set(meta, prismInstance) } - return derivation as $IntentionalAny + return prismInstance as $IntentionalAny } function isIdentityPrismProvider(val: unknown): val is IdentityPrismProvider { @@ -294,10 +294,10 @@ function isIdentityPrismProvider(val: unknown): val is IdentityPrismProvider { /** * Convenience function that returns a plain value from its argument, whether it - * is a pointer, a derivation or a plain value itself. + * is a pointer, a prism or a plain value itself. * * @remarks - * For pointers, the value is returned by first creating a derivation, so it is + * For pointers, the value is returned by first creating a prism, so it is * reactive e.g. when used in a `prism`. * * @param input - The argument to return a value from. diff --git a/packages/dataverse/src/Box.ts b/packages/dataverse/src/Box.ts index 2cd739a..1715c12 100644 --- a/packages/dataverse/src/Box.ts +++ b/packages/dataverse/src/Box.ts @@ -17,24 +17,23 @@ export interface IBox { * Gets the value of the Box. * * @remarks - * Usages of `get()` aren't tracked, they are only for retrieving the value. To track changes, you need to - * create a derivation. + * Usages of `get()` aren't tracked, they are only for retrieving the value. To track changes, you need use a prism. * - * @see derivation + * @see prism */ get(): V /** - * Creates a derivation of the Box that you can use to track changes to it. + * Returns a prism of the Box that you can use to track changes to it. */ - derivation: Prism + prism: Prism } /** * Wraps a single value. * * @remarks - * Derivations created with {@link Box.derivation} update based on strict equality (`===`) of the old value and the new one. + * Derivations created with {@link Box.prism} update based on strict equality (`===`) of the old value and the new one. * This also means that property-changes of objects won't be tracked, and that for objects, updates will trigger on changes of * reference even if the objects are structurally equal. */ @@ -74,18 +73,18 @@ export default class Box implements IBox { * Gets the value of the Box. * * Note: usages of `get()` aren't tracked, they are only for retrieving the value. To track changes, you need to - * create a derivation. + * use a prism. * - * @see Box.derivation + * @see Box.prism */ get() { return this._value } /** - * Creates a derivation of the Box that you can use to track changes to it. + * Returns a prism of the Box that you can use to track changes to it. */ - get derivation() { + get prism() { return this._publicDerivation } } diff --git a/packages/dataverse/src/PointerProxy.ts b/packages/dataverse/src/PointerProxy.ts index 56d57de..d0274aa 100644 --- a/packages/dataverse/src/PointerProxy.ts +++ b/packages/dataverse/src/PointerProxy.ts @@ -44,13 +44,13 @@ export default class PointerProxy } /** - * Returns a derivation of the value at the provided sub-path of the proxied pointer. + * Returns a prism of the value at the provided sub-path of the proxied pointer. * - * @param path - The path to create the derivation at. + * @param path - The path to create the prism at. */ getIdentityPrism(path: Array) { return prism(() => { - const currentPointer = this._currentPointerBox.derivation.getValue() + const currentPointer = this._currentPointerBox.prism.getValue() const subPointer = path.reduce( (pointerSoFar, pathItem) => (pointerSoFar as $IntentionalAny)[pathItem], currentPointer, diff --git a/packages/dataverse/src/derivations/Interface.ts b/packages/dataverse/src/derivations/Interface.ts index d215566..4ff5268 100644 --- a/packages/dataverse/src/derivations/Interface.ts +++ b/packages/dataverse/src/derivations/Interface.ts @@ -4,16 +4,16 @@ import type {$IntentionalAny, VoidFn} from '../types' type IDependent = (msgComingFrom: Prism<$IntentionalAny>) => void /** - * Common interface for derivations. + * Common interface for prisms. */ export interface Prism { /** - * Whether the object is a derivation. + * Whether the object is a prism. */ isPrism: true /** - * Whether the derivation is hot. + * Whether the prism is hot. */ isHot: boolean @@ -29,14 +29,14 @@ export interface Prism { onStale(cb: () => void): VoidFn /** - * Keep the derivation hot, even if there are no tappers (subscribers). + * Keep the prism hot, even if there are no tappers (subscribers). */ keepHot(): VoidFn /** - * Add a derivation as a dependent of this derivation. + * Add a prism as a dependent of this prism. * - * @param d - The derivation to be made a dependent of this derivation. + * @param d - The prism to be made a dependent of this prism. * * @see _removeDependent * @@ -45,9 +45,9 @@ export interface Prism { _addDependent(d: IDependent): void /** - * Remove a derivation as a dependent of this derivation. + * Remove a prism as a dependent of this prism. * - * @param d - The derivation to be removed from as a dependent of this derivation. + * @param d - The prism to be removed from as a dependent of this prism. * * @see _addDependent * @internal @@ -55,13 +55,13 @@ export interface Prism { _removeDependent(d: IDependent): void /** - * Gets the current value of the derivation. If the value is stale, it causes the derivation to freshen. + * Gets the current value of the prism. If the value is stale, it causes the prism to freshen. */ getValue(): V } /** - * Returns whether `d` is a derivation. + * Returns whether `d` is a prism. */ export function isPrism(d: any): d is Prism { return d && d.isPrism && d.isPrism === true diff --git a/packages/dataverse/src/derivations/prism/prism.test.ts b/packages/dataverse/src/derivations/prism/prism.test.ts index c955e54..f318526 100644 --- a/packages/dataverse/src/derivations/prism/prism.test.ts +++ b/packages/dataverse/src/derivations/prism/prism.test.ts @@ -93,7 +93,7 @@ describe('prism', () => { const a = new Atom({letter: 'a'}) - const derivation = prism(() => { + const prsm = prism(() => { const n = val(a.pointer.letter) const iterationAtTimeOfCall = iteration sequence.push({derivationCall: iterationAtTimeOfCall}) @@ -112,7 +112,7 @@ describe('prism', () => { return n }) - const untap = derivation.onChange(ticker, (change) => { + const untap = prsm.onChange(ticker, (change) => { sequence.push({change}) }) @@ -153,7 +153,7 @@ describe('prism', () => { const a = new Atom({letter: 'a'}) - const derivation = prism(() => { + const prsm = prism(() => { const n = val(a.pointer.letter) const iterationAtTimeOfCall = iteration sequence.push({derivationCall: iterationAtTimeOfCall}) @@ -172,7 +172,7 @@ describe('prism', () => { return n }) - const untap = derivation.onChange(ticker, (change) => { + const untap = prsm.onChange(ticker, (change) => { sequence.push({change}) }) diff --git a/packages/dataverse/src/derivations/prism/prism.ts b/packages/dataverse/src/derivations/prism/prism.ts index e074e41..1acb25d 100644 --- a/packages/dataverse/src/derivations/prism/prism.ts +++ b/packages/dataverse/src/derivations/prism/prism.ts @@ -43,7 +43,7 @@ class HotHandle { protected _lastValue: undefined | V = undefined /** - * If true, the derivation is stale even though its dependencies aren't + * If true, the prism is stale even though its dependencies aren't * marked as such. This is used by `prism.source()` and `prism.state()` * to mark the prism as stale. */ @@ -200,7 +200,7 @@ const emptyObject = {} class PrismDerivation implements Prism { /** - * Whether the object is a derivation. + * Whether the object is a prism. */ readonly isPrism: true = true @@ -214,7 +214,7 @@ class PrismDerivation implements Prism { constructor(private readonly _fn: () => V) {} /** - * Whether the derivation is hot. + * Whether the prism is hot. */ get isHot(): boolean { return this._state.hot @@ -266,16 +266,16 @@ class PrismDerivation implements Prism { } /** - * Keep the derivation hot, even if there are no tappers (subscribers). + * Keep the prism hot, even if there are no tappers (subscribers). */ keepHot() { return this.onStale(() => {}) } /** - * Add a derivation as a dependent of this derivation. + * Add a prism as a dependent of this prism. * - * @param d - The derivation to be made a dependent of this derivation. + * @param d - The prism to be made a dependent of this prism. * * @see _removeDependent */ @@ -295,9 +295,9 @@ class PrismDerivation implements Prism { } /** - * Remove a derivation as a dependent of this derivation. + * Remove a prism as a dependent of this prism. * - * @param d - The derivation to be removed from as a dependent of this derivation. + * @param d - The prism to be removed from as a dependent of this prism. * * @see _addDependent */ @@ -315,23 +315,23 @@ class PrismDerivation implements Prism { } /** - * Gets the current value of the derivation. If the value is stale, it causes the derivation to freshen. + * Gets the current value of the prism. If the value is stale, it causes the prism to freshen. */ getValue(): V { /** * TODO We should prevent (or warn about) a common mistake users make, which is reading the value of - * a derivation in the body of a react component (e.g. `der.getValue()` (often via `val()`) instead of `useVal()` + * a prism in the body of a react component (e.g. `der.getValue()` (often via `val()`) instead of `useVal()` * or `uesPrism()`). * * Although that's the most common example of this mistake, you can also find it outside of react components. * Basically the user runs `der.getValue()` assuming the read is detected by a wrapping prism when it's not. * - * Sometiems the derivation isn't even hot when the user assumes it is. + * Sometiems the prism isn't even hot when the user assumes it is. * * We can fix this type of mistake by: - * 1. Warning the user when they call `getValue()` on a cold derivation. - * 2. Warning the user about calling `getValue()` on a hot-but-stale derivation - * if `getValue()` isn't called by a known mechanism like a `DerivationEmitter`. + * 1. Warning the user when they call `getValue()` on a cold prism. + * 2. Warning the user about calling `getValue()` on a hot-but-stale prism + * if `getValue()` isn't called by a known mechanism like a `PrismEmitter`. * * Design constraints: * - This fix should not have a perf-penalty in production. Perhaps use a global flag + `process.env.NODE_ENV !== 'production'` @@ -616,7 +616,7 @@ function memo( * ```ts * import {prism} from 'dataverse' * - * // This derivation holds the current mouse position and updates when the mouse moves + * // This prism holds the current mouse position and updates when the mouse moves * const mousePositionD = prism(() => { * const [pos, setPos] = prism.state<[x: number, y: number]>('pos', [0, 0]) * @@ -736,10 +736,10 @@ type IPrismFn = { } /** - * Creates a derivation from the passed function that adds all derivations referenced + * Creates a prism from the passed function that adds all prisms referenced * in it as dependencies, and reruns the function when these change. * - * @param fn - The function to rerun when the derivations referenced in it change. + * @param fn - The function to rerun when the prisms referenced in it change. */ const prism: IPrismFn = (fn) => { return new PrismDerivation(fn) diff --git a/packages/dataverse/src/pointer.ts b/packages/dataverse/src/pointer.ts index 65d0645..3301126 100644 --- a/packages/dataverse/src/pointer.ts +++ b/packages/dataverse/src/pointer.ts @@ -153,7 +153,7 @@ export const getPointerParts = <_>( * * @example * ```ts - * // Here, sum is a derivation that updates whenever the a or b prop of someAtom does. + * // Here, sum is a prism that updates whenever the a or b prop of someAtom does. * const sum = prism(() => { * return val(pointer({root: someAtom, path: ['a']})) + val(pointer({root: someAtom, path: ['b']})); * }); diff --git a/packages/playground/src/shared/hello-world-extension-dataverse/index.tsx b/packages/playground/src/shared/hello-world-extension-dataverse/index.tsx index 9d8d513..4a3a308 100644 --- a/packages/playground/src/shared/hello-world-extension-dataverse/index.tsx +++ b/packages/playground/src/shared/hello-world-extension-dataverse/index.tsx @@ -31,7 +31,7 @@ studio.extend({ const untapFn = prism(() => [ { type: 'Switch', - value: val(exampleBox.derivation), + value: val(exampleBox.prism), onChange: (value) => exampleBox.set(value), options: [ { @@ -55,7 +55,7 @@ studio.extend({ }, }, ]) - // listen to changes to this derivation using the requestAnimationFrame shared ticker + // listen to changes to this prism using the requestAnimationFrame shared ticker .onChange( Ticker.raf, (value) => { diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index a72781b..3e5c5df 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -65,16 +65,16 @@ export function usePrism( boxRef.current.set(fnAsCallback) } - const derivation = useMemo( + const pr = useMemo( () => prism(() => { - const fn = boxRef.current.derivation.getValue() + const fn = boxRef.current.prism.getValue() return fn() }), [], ) - return useDerivation(derivation, debugLabel) + return useDerivation(pr, debugLabel) } export const useVal: typeof val = (p: $IntentionalAny, debugLabel?: string) => { @@ -88,9 +88,9 @@ export const useVal: typeof val = (p: $IntentionalAny, debugLabel?: string) => { let lastOrder = 0 /** - * A sorted array of derivations that need to be refreshed. The derivations are sorted - * by their order, which means a parent derivation always gets priority to children - * and descendents. Ie. we refresh the derivations top to bottom. + * A sorted array of prisms that need to be refreshed. The prisms are sorted + * by their order, which means a parent prism always gets priority to children + * and descendents. Ie. we refresh the prisms top to bottom. */ const queue: QueueItem[] = [] const setOfQueuedItems = new Set() @@ -99,7 +99,7 @@ type QueueItem = { order: number /** * runUpdate() is the equivalent of a forceUpdate() call. It would only be called - * if the value of the inner derivation has _actually_ changed. + * if the value of the inner prism has _actually_ changed. */ runUpdate: VoidFn /** @@ -142,11 +142,11 @@ type QueueItem = { > } /** - * A reference to the derivation + * A reference to the prism */ der: Prism /** - * The last value of this derivation. + * The last value of this prism. */ lastValue: T /** @@ -246,17 +246,17 @@ function queueIfNeeded() { }) } /** - * A React hook that returns the value of the derivation that it received as the first argument. + * A React hook that returns the value of the prism that it received as the first argument. * It works like an implementation of Dataverse's Ticker, except that it runs the side effects in - * an order where a component's derivation is guaranteed to run before any of its descendents' derivations. + * an order where a component's prism is guaranteed to run before any of its descendents' prisms. * - * @param der - The derivation + * @param der - The prism * @param debugLabel - The label used by the debugger * * @remarks - * It looks like this new implementation of useDerivation() manages to: - * 1. Not over-calculate the derivations - * 2. Render derivation in ancestor -\> descendent order + * It looks like this new implementation of usePrism() manages to: + * 1. Not over-calculate the prisms + * 2. Render prism in ancestor -\> descendent order * 3. Not set off React's concurrent mode alarms * * @@ -266,21 +266,21 @@ function queueIfNeeded() { * * Notes on the latest implementation: * - * # Remove cold derivation reads + * # Remove cold prism reads * - * Prior to the latest change, the first render of every `useDerivation()` resulted in a cold read of its inner derivation. + * Prior to the latest change, the first render of every `useDerivation()` resulted in a cold read of its inner prism. * Cold reads are predictably slow. The reason we'd run cold reads was to comply with react's rule of not running side-effects - * during render. (Turning a derivation hot is _technically_ a side-effect). + * during render. (Turning a prism hot is _technically_ a side-effect). * * However, now that users are animating scenes with hundreds of objects in the same sequence, the lag started to be noticable. * - * This commit changes `useDerivation()` so that it turns its derivation hot before rendering them. + * This commit changes `useDerivation()` so that it turns its prism hot before rendering them. * - * # Freshen derivations before render + * # Freshen prisms before render * * Previously in order to avoid the zombie child problem (https://kaihao.dev/posts/stale-props-and-zombie-children-in-redux) - * we deferred freshening the derivations to the render phase of components. This meant that if a derivation's dependencies - * changed, `useDerivation()` would schedule a re-render, regardless of whether that change actually affected the derivation's + * we deferred freshening the prisms to the render phase of components. This meant that if a prism's dependencies + * changed, `useDerivation()` would schedule a re-render, regardless of whether that change actually affected the prism's * value. Here is a contrived example: * * ```ts @@ -294,10 +294,10 @@ function queueIfNeeded() { * num.set(2) // would cause Comp to re-render- even though 1 is still a positive number * ``` * - * We now avoid this problem by freshening the derivation (i.e. calling `der.getValue()`) inside `runQueue()`, - * and then only causing a re-render if the derivation's value is actually changed. + * We now avoid this problem by freshening the prism (i.e. calling `der.getValue()`) inside `runQueue()`, + * and then only causing a re-render if the prism's value is actually changed. * - * This still avoids the zombie-child problem because `runQueue` reads the derivations in-order of their position in + * This still avoids the zombie-child problem because `runQueue` reads the prisms in-order of their position in * the mounting tree. * * On the off-chance that one of them still turns out to be a zombile child, `runQueue` will defer that particular @@ -374,29 +374,29 @@ export function useDerivation(der: Prism, debugLabel?: string): T { } /** - * This makes sure the prism derivation remains hot as long as the + * This makes sure the prism prism remains hot as long as the * component calling the hook is alive, but it does not - * return the value of the derivation, and it does not - * re-render the component if the value of the derivation changes. + * return the value of the prism, and it does not + * re-render the component if the value of the prism changes. * - * Use this hook if you plan to read a derivation in a - * useEffect() call, without the derivation causing your + * Use this hook if you plan to read a prism in a + * useEffect() call, without the prism causing your * element to re-render. */ export function usePrismWithoutReRender( fn: () => T, deps: unknown[], ): Prism { - const derivation = useMemo(() => prism(fn), deps) + const pr = useMemo(() => prism(fn), deps) - return useDerivationWithoutReRender(derivation) + return useDerivationWithoutReRender(pr) } /** - * This makes sure the derivation remains hot as long as the + * This makes sure the prism remains hot as long as the * component calling the hook is alive, but it does not - * return the value of the derivation, and it does not - * re-render the component if the value of the derivation changes. + * return the value of the prism, and it does not + * re-render the component if the value of the prism changes. */ export function useDerivationWithoutReRender(der: Prism): Prism { useEffect(() => { diff --git a/theatre/core/src/coreExports.ts b/theatre/core/src/coreExports.ts index d2e05f0..fc2edad 100644 --- a/theatre/core/src/coreExports.ts +++ b/theatre/core/src/coreExports.ts @@ -155,17 +155,13 @@ export function onChange

>( callback: (value: P extends PointerType ? T : unknown) => void, ): VoidFn { if (isPointer(pointer)) { - const derivation = pointerToPrism(pointer) - return derivation.onChange( - getCoreTicker(), - callback as $IntentionalAny, - true, - ) + const pr = pointerToPrism(pointer) + return pr.onChange(getCoreTicker(), callback as $IntentionalAny, true) } else if (isPrism(pointer)) { return pointer.onChange(getCoreTicker(), callback as $IntentionalAny, true) } else { throw new Error( - `Called onChange(p) where p is neither a pointer nor a derivation.`, + `Called onChange(p) where p is neither a pointer nor a prism.`, ) } } diff --git a/theatre/core/src/projects/initialiseProjectState.ts b/theatre/core/src/projects/initialiseProjectState.ts index 7da82b0..e074ed5 100644 --- a/theatre/core/src/projects/initialiseProjectState.ts +++ b/theatre/core/src/projects/initialiseProjectState.ts @@ -7,7 +7,7 @@ import globals from '@theatre/shared/globals' /** * @remarks - * TODO this could be turned into a simple derivation, like: + * TODO this could be turned into a simple prism, like: * `editor.isReady: Prism<{isReady: true} | {isReady: false, reason: 'conflictBetweenDiskStateAndBrowserState'}>` */ export default async function initialiseProjectState( diff --git a/theatre/core/src/sequences/Sequence.ts b/theatre/core/src/sequences/Sequence.ts index 668cf3b..b19355b 100644 --- a/theatre/core/src/sequences/Sequence.ts +++ b/theatre/core/src/sequences/Sequence.ts @@ -67,7 +67,7 @@ export default class Sequence { ) this._statePointerDerivation = prism( - () => this._playbackControllerBox.derivation.getValue().statePointer, + () => this._playbackControllerBox.prism.getValue().statePointer, ) this._positionD = prism(() => { @@ -189,7 +189,7 @@ export default class Sequence { * @remarks * One use case for this is to play the playback within the focus range. * - * @param rangeD - The derivation that contains the range that will be used for the playback + * @param rangeD - The prism that contains the range that will be used for the playback * * @returns a promise that gets rejected if the playback stopped for whatever reason * diff --git a/theatre/core/src/sequences/playbackControllers/DefaultPlaybackController.ts b/theatre/core/src/sequences/playbackControllers/DefaultPlaybackController.ts index 1023de0..11a8835 100644 --- a/theatre/core/src/sequences/playbackControllers/DefaultPlaybackController.ts +++ b/theatre/core/src/sequences/playbackControllers/DefaultPlaybackController.ts @@ -31,7 +31,7 @@ export interface IPlaybackController { * @remarks * One use case for this is to play the playback within the focus range. * - * @param rangeD - The derivation that contains the range that will be used for the playback + * @param rangeD - The prism that contains the range that will be used for the playback * * @returns a promise that gets rejected if the playback stopped for whatever reason * diff --git a/theatre/core/src/sheetObjects/SheetObject.ts b/theatre/core/src/sheetObjects/SheetObject.ts index 25d09af..e0dfce1 100644 --- a/theatre/core/src/sheetObjects/SheetObject.ts +++ b/theatre/core/src/sheetObjects/SheetObject.ts @@ -70,8 +70,8 @@ export default class SheetObject implements IdentityPrismProvider { } getValues(): Prism> { - // Cache the derivation because only one is needed per SheetObject. - // Also, if `onValuesChange()` is unsubscribed from, this derivation will go cold + // Cache the prism because only one is needed per SheetObject. + // Also, if `onValuesChange()` is unsubscribed from, this prism will go cold // and free its resources. So it's no problem to still keep it on the cache. return this._cache.get('getValues()', () => prism(() => { @@ -107,7 +107,7 @@ export default class SheetObject implements IdentityPrismProvider { /** * The lowest layer is the default value of the root prop. Since an object's config - * _could_ change, we read it as a derivation. Otherwise, we could have just `getDefaultsOfPropTypeConfig(this.template.staticConfig)`. + * _could_ change, we read it as a prism. Otherwise, we could have just `getDefaultsOfPropTypeConfig(this.template.staticConfig)`. * * Note: If studio is not present, there is no known use-case for the config of an object to change on the fly, so * we could read this value statically. @@ -168,7 +168,7 @@ export default class SheetObject implements IdentityPrismProvider { let sequenced { - // NOTE: we're reading the sequenced values as a derivation to a pointer. This should be refactored + // NOTE: we're reading the sequenced values as a prism to a pointer. This should be refactored // to a simple pointer. const pointerToSequencedValuesD = prism.memo( 'seq', @@ -185,7 +185,7 @@ export default class SheetObject implements IdentityPrismProvider { ) // read the sequenced values - // (val(val(x))) unwraps the pointer and the derivation + // (val(val(x))) unwraps the pointer and the prism sequenced = val(val(pointerToSequencedValuesD)) // deep-merge the sequenced values with the previous layer @@ -243,7 +243,7 @@ export default class SheetObject implements IdentityPrismProvider { const untaps: Array<() => void> = [] for (const {trackId, pathToProp} of tracksToProcess) { - const derivation = this._trackIdToDerivation(trackId) + const pr = this._trackIdToPrism(trackId) const propConfig = getPropConfigByPath( config, pathToProp, @@ -254,7 +254,7 @@ export default class SheetObject implements IdentityPrismProvider { propConfig.interpolate! as Interpolator<$IntentionalAny> const updateSequenceValueFromItsDerivation = () => { - const triple = derivation.getValue() + const triple = pr.getValue() if (!triple) return valsAtom.setIn(pathToProp, undefined) @@ -279,9 +279,7 @@ export default class SheetObject implements IdentityPrismProvider { interpolate(left, right, triple.progression), ) } - const untap = derivation.onStale( - updateSequenceValueFromItsDerivation, - ) + const untap = pr.onStale(updateSequenceValueFromItsDerivation) updateSequenceValueFromItsDerivation() untaps.push(untap) @@ -299,7 +297,7 @@ export default class SheetObject implements IdentityPrismProvider { }) } - protected _trackIdToDerivation( + protected _trackIdToPrism( trackId: SequenceTrackId, ): Prism { const trackP = diff --git a/theatre/core/src/sheetObjects/TheatreSheetObject.ts b/theatre/core/src/sheetObjects/TheatreSheetObject.ts index 57c7d52..91659c2 100644 --- a/theatre/core/src/sheetObjects/TheatreSheetObject.ts +++ b/theatre/core/src/sheetObjects/TheatreSheetObject.ts @@ -147,7 +147,7 @@ export default class TheatreSheetObject< return {...privateAPI(this).address} } - private _valuesDerivation(): Prism { + private _valuesPrism(): Prism { return this._cache.get('onValuesChangeDerivation', () => { const sheetObject = privateAPI(this) const d: Prism> = prism(() => { @@ -158,15 +158,15 @@ export default class TheatreSheetObject< } onValuesChange(fn: (values: this['value']) => void): VoidFn { - return this._valuesDerivation().onChange(getCoreTicker(), fn, true) + return this._valuesPrism().onChange(getCoreTicker(), fn, true) } // internal: Make the deviration keepHot if directly read get value(): PropsValue { - const der = this._valuesDerivation() + const der = this._valuesPrism() if (KEEP_HOT_FOR_MS != null) { if (!der.isHot) { - // derivation not hot, so keep it hot and set up `_keepHotUntapDebounce` + // prism not hot, so keep it hot and set up `_keepHotUntapDebounce` if (this._keepHotUntapDebounce != null) { // defensive checks if (process.env.NODE_ENV === 'development') { diff --git a/theatre/studio/src/UIRoot/useKeyboardShortcuts.ts b/theatre/studio/src/UIRoot/useKeyboardShortcuts.ts index eb461ea..a1c9e68 100644 --- a/theatre/studio/src/UIRoot/useKeyboardShortcuts.ts +++ b/theatre/studio/src/UIRoot/useKeyboardShortcuts.ts @@ -54,7 +54,7 @@ export default function useKeyboardShortcuts() { const {projectId, sheetId} = seq.address /* - * The value of this derivation is an array that contains the + * The value of this prism is an array that contains the * range of the playback (start and end), and a boolean that is * `true` if the playback should be played within that range. */ @@ -162,7 +162,7 @@ const getPlaybackStateBox = memoizeFn( ) /* - * A memoized function that returns a derivation with a boolean value. + * A memoized function that returns a prism with a boolean value. * This value is set to `true` if: * 1. the playback is playing and using the focus range instead of the whole sequence * 2. the playback is stopped, but would use the focus range if it were started. @@ -171,7 +171,7 @@ export const getIsPlayheadAttachedToFocusRange = memoizeFn( (sequence: Sequence) => prism(() => { const controlledPlaybackState = - getPlaybackStateBox(sequence).derivation.getValue() + getPlaybackStateBox(sequence).prism.getValue() if (controlledPlaybackState) { return controlledPlaybackState.getValue().isFollowingARange } else { diff --git a/theatre/studio/src/panels/DetailPanel/DetailPanel.tsx b/theatre/studio/src/panels/DetailPanel/DetailPanel.tsx index 603f81b..acf919e 100644 --- a/theatre/studio/src/panels/DetailPanel/DetailPanel.tsx +++ b/theatre/studio/src/panels/DetailPanel/DetailPanel.tsx @@ -199,8 +199,8 @@ const isDetailPanelHotspotActiveB = new Box(false) const isDetailPanelHoveredB = new Box(false) export const shouldShowDetailD = prism(() => { - const isHovered = val(isDetailPanelHoveredB.derivation) - const isHotspotActive = val(isDetailPanelHotspotActiveB.derivation) + const isHovered = val(isDetailPanelHoveredB.prism) + const isHotspotActive = val(isDetailPanelHotspotActiveB.prism) return isHovered || isHotspotActive }) diff --git a/theatre/studio/src/panels/OutlinePanel/OutlinePanel.tsx b/theatre/studio/src/panels/OutlinePanel/OutlinePanel.tsx index 9bd0884..e4c98fc 100644 --- a/theatre/studio/src/panels/OutlinePanel/OutlinePanel.tsx +++ b/theatre/studio/src/panels/OutlinePanel/OutlinePanel.tsx @@ -83,8 +83,8 @@ const isOutlinePanelHotspotActiveB = new Box(false) const isOutlinePanelHoveredB = new Box(false) export const shouldShowOutlineD = prism(() => { - const isHovered = val(isOutlinePanelHoveredB.derivation) - const isHotspotActive = val(isOutlinePanelHotspotActiveB.derivation) + const isHovered = val(isOutlinePanelHoveredB.prism) + const isHotspotActive = val(isOutlinePanelHotspotActiveB.prism) return isHovered || isHotspotActive }) diff --git a/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveEditorPopover.tsx b/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveEditorPopover.tsx index b658197..4a6fa52 100644 --- a/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveEditorPopover.tsx +++ b/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/BasicKeyframedTrack/KeyframeEditor/CurveEditorPopover/CurveEditorPopover.tsx @@ -545,12 +545,12 @@ const {isCurveEditorOpenD, isConnectionEditingInCurvePopover, getLock} = } }, isCurveEditorOpenD: prism(() => { - return connectionsInCurvePopoverEdit.derivation.getValue().length > 0 + return connectionsInCurvePopoverEdit.prism.getValue().length > 0 }), // must be run in a prism isConnectionEditingInCurvePopover(con: KeyframeConnectionWithAddress) { prism.ensurePrism() - return connectionsInCurvePopoverEdit.derivation + return connectionsInCurvePopoverEdit.prism .getValue() .some( ({left, right}) => diff --git a/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/KeyframeSnapTarget.tsx b/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/KeyframeSnapTarget.tsx index fad2c44..4c105dd 100644 --- a/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/KeyframeSnapTarget.tsx +++ b/theatre/studio/src/panels/SequenceEditorPanel/DopeSheet/Right/KeyframeSnapTarget.tsx @@ -78,7 +78,7 @@ const stateB = new Box< } >({mode: 'snapToNone'}) -export const snapPositionsStateD = stateB.derivation +export const snapPositionsStateD = stateB.prism export function snapToAll() { stateB.set({mode: 'snapToAll'}) diff --git a/theatre/studio/src/toolbars/ExtensionToolbar/ExtensionToolbar.tsx b/theatre/studio/src/toolbars/ExtensionToolbar/ExtensionToolbar.tsx index 71a36a4..3f8a8fe 100644 --- a/theatre/studio/src/toolbars/ExtensionToolbar/ExtensionToolbar.tsx +++ b/theatre/studio/src/toolbars/ExtensionToolbar/ExtensionToolbar.tsx @@ -40,7 +40,7 @@ const ExtensionToolsetRender: React.FC<{ if (typeof detach === 'function') return detach }, [extension, toolbarId]) - const config = useVal(toolsetConfigBox.derivation) + const config = useVal(toolsetConfigBox.prism) return } diff --git a/theatre/studio/src/uiComponents/Popover/TooltipContext.tsx b/theatre/studio/src/uiComponents/Popover/TooltipContext.tsx index e7dc418..15a463e 100644 --- a/theatre/studio/src/uiComponents/Popover/TooltipContext.tsx +++ b/theatre/studio/src/uiComponents/Popover/TooltipContext.tsx @@ -41,7 +41,7 @@ export const useTooltipOpenState = (): [ const TooltipContext: React.FC<{}> = ({children}) => { const currentTooltipId = useMemo(() => new Box(-1), []) - const cur = currentTooltipId.derivation + const cur = currentTooltipId.prism const set = useMemo(() => { let lastTimeout: NodeJS.Timeout | undefined = undefined diff --git a/theatre/studio/src/uiComponents/usePresence.tsx b/theatre/studio/src/uiComponents/usePresence.tsx index c1e0dac..667e4f2 100644 --- a/theatre/studio/src/uiComponents/usePresence.tsx +++ b/theatre/studio/src/uiComponents/usePresence.tsx @@ -68,7 +68,7 @@ function createPresenceContext(options: { const focusD = useMemo(() => { if (!itemKey) return undefinedD // this is the thing being hovered - const currentD = currentUserHoverItemB.derivation + const currentD = currentUserHoverItemB.prism const primaryFocusDer = pointerToPrism( currentUserHoverFlagItemsAtom.pointer[itemKey], ) diff --git a/theatre/studio/src/utils/mousePositionD.ts b/theatre/studio/src/utils/mousePositionD.ts index b50f214..49f0e6b 100644 --- a/theatre/studio/src/utils/mousePositionD.ts +++ b/theatre/studio/src/utils/mousePositionD.ts @@ -1,7 +1,7 @@ import {prism} from '@theatre/dataverse' /** - * A derivation that holds the current mouse position. + * A prism that holds the current mouse position. */ const mousePositionD = prism(() => { const [pos, setPos] = prism.state('pos', null)