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)
}
}
}