import { Resume } from '@typed/env' import { Effects } from '../Effect' import { Fiber, FiberState } from './Fiber' export type Kill = { readonly kill: (f: Fiber) => Resume } export const Kill: Kill = { kill(fiber: Fiber): Resume { const { info } = fiber if (info.state === FiberState.Running) { fiber.info = { state: FiberState.Error, error: new KillError() } fiber.dispose() return Resume.of(true) } return Resume.of(false) }, } export function* kill(f: Fiber): Effects { return yield (c) => c.kill(f) } export class KillError extends Error { public static readonly message = `Kill` constructor() { super(KillError.message) if (Error.captureStackTrace) { Error.captureStackTrace(this) } } }