Add exit constructor

This commit is contained in:
Eric Rumsey 2025-06-02 14:25:46 -05:00
parent e83fcd0b4d
commit cafc857e56

View File

@ -16,21 +16,26 @@ import {
origin, origin,
} from './canvas' } from './canvas'
interface PainterExit extends Tag<'PainterExit'> {} interface PainterExit<E> extends Tag<'PainterExit'> {
value: Either<E, Error>
}
interface PainterTask<T extends object = {}> extends Tag<'PainterTask'> { interface PainterTask<E, T extends object = {}> extends Tag<'PainterTask'> {
task: { task: {
origin: CanvasOrigin, origin: CanvasOrigin,
end: CanvasEnd, end: CanvasEnd,
effect: PainterEffect<T & Tag<'PainterState'>>, effect: PainterEffect<E, T>,
state: Option<T & Tag<'PainterState'>>, state: Option<T & Tag<'PainterState'>>,
} }
} }
type TaskConstructor<T extends object = {}> = ( type TaskConstructor = (
x: CursorPos, x: CursorPos,
y: CursorPos, y: CursorPos,
) => (f: PainterEffect, state?: T & Tag<'PainterState'>) => PainterTask<T> ) => <E = number, T extends object = {}>(
f: PainterEffect<E, T>,
state?: T & Tag<'PainterState'>,
) => PainterTask<E, T>
const task: TaskConstructor = (x, y) => (f, state?) => { const task: TaskConstructor = (x, y) => (f, state?) => {
return { return {
_tag: 'PainterTask', _tag: 'PainterTask',
@ -43,14 +48,25 @@ const task: TaskConstructor = (x, y) => (f, state?) => {
} }
} }
type ExitConstructor = <T>(x: Either<T, Error>) => PainterExit<T>
const exit: ExitConstructor = x => ({_tag: 'PainterExit', value: x})
type PainterEffect< type PainterEffect<
E,
T extends object = {}, T extends object = {},
> = (task: PainterTask<T>) => Either<PainterTask<T>, PainterExit> > = (task: PainterTask<T>) => Either<PainterTask<T>, PainterExit<E>>
type EffectState = <T extends object = {}>(x: T) => T & Tag<'PainterState'> type EffectState = <T extends object = {}>(x: T) => T & Tag<'PainterState'>
const effectState: EffectState = x => ({_tag: 'PainterState', ...x}) const effectState: EffectState = x => ({_tag: 'PainterState', ...x})
export { type PainterEffect, task } export {
type EffectState as PainterState,
effectState as tagState,
exit,
type PainterEffect,
type PainterTask,
task,
}
// //
// testing // testing