Working lazyref extension
Some checks failed
Lint / lint (push) Failing after 12s

This commit is contained in:
Julien Valverdé
2025-02-25 12:17:45 +01:00
parent d9a01dae0f
commit 8754020323
8 changed files with 103 additions and 25 deletions

View File

@@ -1,10 +1,12 @@
import type * as ReffuseContext from "./ReffuseContext.js"
import type * as ReffuseExtension from "./ReffuseExtension.js"
import * as ReffuseHelpers from "./ReffuseHelpers.js"
import type { Merge, StaticType } from "./types.js"
export class Reffuse extends ReffuseHelpers.make() {}
export const withContexts = <R2 extends Array<unknown>>(
...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext<R2[K]> }]
) =>
@@ -27,3 +29,19 @@ export const withContexts = <R2 extends Array<unknown>>(
) => class extends self {
static readonly contexts = [...self.contexts, ...contexts]
} as any
export const withExtension = <A extends object>(extension: ReffuseExtension.ReffuseExtension<A>) =>
<
BaseClass extends ReffuseHelpers.ReffuseHelpersClass<R>,
R
>(
self: BaseClass & ReffuseHelpers.ReffuseHelpersClass<R>
): (
{ new(): Merge<InstanceType<BaseClass>, A> } &
StaticType<BaseClass>
) => {
const class_ = class extends self {}
Object.assign(class_.prototype, extension())
return class_ as any
}

View File

@@ -3,7 +3,6 @@ import * as React from "react"
import * as ReffuseRuntime from "./ReffuseRuntime.js"
// TODO: merge this with the Provider, just like React 19 contexts
export class ReffuseContext<R> {
readonly Context = React.createContext<Context.Context<R>>(null!)
@@ -11,7 +10,7 @@ export class ReffuseContext<R> {
constructor() {
// TODO: scope the layer creation
this.Provider = (props) => {
this.Provider = props => {
const runtime = ReffuseRuntime.useRuntime()
const value = React.useMemo(() => Effect.context<R>().pipe(

View File

@@ -1,18 +1,7 @@
import type * as ReffuseHelpers from "./ReffuseHelpers.js"
import type { Merge, StaticType } from "./types.js"
export interface ReffuseExtension<A extends object> {
(): A
readonly Type: A
}
export const make = <Ext extends object>(extension: () => Ext) =>
<
BaseClass extends ReffuseHelpers.ReffuseHelpersClass<R>,
R
>(
self: BaseClass & ReffuseHelpers.ReffuseHelpersClass<R>
): (
{ new(): Merge<InstanceType<BaseClass>, Ext> } &
StaticType<BaseClass>
) => {
const class_ = class extends self {}
Object.assign(class_.prototype, extension())
return class_ as any
}
export const make = <A extends object>(extension: () => A): ReffuseExtension<A> =>
extension as ReffuseExtension<A>