import * as T from "../../../base/lib/types" export type InstallFn = (opts: { effects: T.Effects }) => Promise export class Install { private constructor( readonly fn: InstallFn, readonly preFn?: InstallFn, ) {} static of( fn: InstallFn, preFn?: InstallFn, ) { return new Install(fn, preFn) } async install({ effects }: Parameters[0]) { await this.fn({ effects, }) } async preInstall({ effects }: Parameters[0]) { this.preFn && (await this.preFn({ effects, })) } } export function setupInstall( fn: InstallFn, preFn?: InstallFn, ) { return Install.of(fn, preFn) }