From cafc857e5654c6e3848341acb57205739a5904af Mon Sep 17 00:00:00 2001 From: Eric Rumsey Date: Mon, 2 Jun 2025 14:25:46 -0500 Subject: [PATCH] Add exit constructor --- src/lib/painter/lifecycle.ts | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/lib/painter/lifecycle.ts b/src/lib/painter/lifecycle.ts index 3315c7c..a55a8fa 100644 --- a/src/lib/painter/lifecycle.ts +++ b/src/lib/painter/lifecycle.ts @@ -16,21 +16,26 @@ import { origin, } from './canvas' -interface PainterExit extends Tag<'PainterExit'> {} +interface PainterExit extends Tag<'PainterExit'> { + value: Either +} -interface PainterTask extends Tag<'PainterTask'> { +interface PainterTask extends Tag<'PainterTask'> { task: { origin: CanvasOrigin, end: CanvasEnd, - effect: PainterEffect>, + effect: PainterEffect, state: Option>, } } -type TaskConstructor = ( +type TaskConstructor = ( x: CursorPos, y: CursorPos, -) => (f: PainterEffect, state?: T & Tag<'PainterState'>) => PainterTask +) => ( + f: PainterEffect, + state?: T & Tag<'PainterState'>, +) => PainterTask const task: TaskConstructor = (x, y) => (f, state?) => { return { _tag: 'PainterTask', @@ -43,14 +48,25 @@ const task: TaskConstructor = (x, y) => (f, state?) => { } } +type ExitConstructor = (x: Either) => PainterExit +const exit: ExitConstructor = x => ({_tag: 'PainterExit', value: x}) + type PainterEffect< + E, T extends object = {}, -> = (task: PainterTask) => Either, PainterExit> +> = (task: PainterTask) => Either, PainterExit> type EffectState = (x: T) => T & Tag<'PainterState'> 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