Files
reffuse/packages/reffuse/src/ReffuseExtension.ts
Julien Valverdé e1349e5e03
Some checks failed
Lint / lint (push) Failing after 11s
Tests
2025-02-21 15:44:28 +01:00

71 lines
1.7 KiB
TypeScript

import { Effect } from "effect"
import * as ReffuseContext from "./ReffuseContext.js"
import * as ReffuseHelpers from "./ReffuseHelpers.js"
import type { Merge, StaticType } from "./types.js"
class Reffuse extends ReffuseHelpers.ReffuseHelpers<never> {}
class MyService extends Effect.Service<MyService>()("MyService", {
succeed: {}
}) {}
const MyContext = ReffuseContext.make<MyService>()
const make = <Ext extends object>(extension: Ext) =>
<
BaseClass extends typeof Reffuse,
R,
>(
base: BaseClass & typeof Reffuse
): (
{ new(): Merge<InstanceType<BaseClass>, Ext> } &
StaticType<BaseClass>
) => {
const class_ = class extends base {}
return class_
}
export const withContexts = <R2 extends Array<unknown>>(
...contexts: [...{ [K in keyof R2]: ReffuseContext.ReffuseContext<R2[K]> }]
) =>
<
BaseClass extends typeof ReffuseHelpers.ReffuseHelpers<R1>,
R1
>(
self: BaseClass & typeof ReffuseHelpers.ReffuseHelpers<R1>
): (
{
new(): Merge<
InstanceType<BaseClass>,
ReffuseHelpers.ReffuseHelpers<R1 | R2[number]>
>
} &
StaticType<BaseClass>
) => {
const instance = new self()
return class extends self {
readonly contexts = [...instance.contexts, ...contexts] as const
} as any
}
const withMyContext = withContexts(MyContext)
const clsWithMyContext = withMyContext(Reffuse)
class ReffuseWithMyContext extends clsWithMyContext {}
const t = new ReffuseWithMyContext()
const cls1 = make({
prout<R>(this: ReffuseHelpers.ReffuseHelpers<R>) {}
})(Reffuse)
class Cls1 extends cls1 {}
const cls2 = make({
aya() {}
})(cls)