import { Disposable } from '@typed/disposable'
import { provide, runPure } from '@typed/env'
import { Capabilities, Effects, PureEffect, Return } from '../Effect'
import { runEffect } from './runEffect'
export function runEffects>(effect: A): Disposable
export function runEffects>(
effect: A,
resources: Capabilities,
onReturn?: (value: Return) => Disposable,
): Disposable
export function runEffects>(
effect: A,
resources: Capabilities = {} as Capabilities,
onReturn?: (value: Return) => Disposable,
): Disposable {
return runPure(
(a) => (onReturn ? onReturn(a) : Disposable.None),
provide(runEffect(effect), resources),
)
}