import { IO } from '@typed/lambda' import { Resume } from './Resume' /** * A computation that has all capabilities supplied */ export interface Pure { // tslint:disable-next-line:callable-types (capabilities: C): Resume } /** * Generic type for computations that depend on capabilities * from the environment. */ export interface Env { // tslint:disable-next-line:callable-types (capabilities: C): Resume } /** * Extracts the capabilities required to satisfy an environment */ export type CapabilitiesOf = A extends Env ? R : never /** * Get the return value of an Env */ export type ValueOf = A extends Env ? R : A extends Pure ? R : never export namespace Pure { export const of = (value: A): Pure => (_) => Resume.of(value) export const fromIO = (io: IO): Pure => (_) => Resume.create((cb) => cb(io())) }