export interface EffectAtom { output: T } export type Effect = EffectAtom[] export interface PrintString<_ extends string> extends EffectAtom { } export interface Print<_ extends any> extends EffectAtom { } // interface Debug<_ extends string, T> extends EffectAtom { } export interface WriteFile<_Path extends string, _Content extends string> extends EffectAtom { } export interface ReadFile<_Path extends string> extends EffectAtom { } export interface Program { effects: Effs, exitCode: ExitCode, } export interface Kind { input: Inp return: Out } export interface WriteFileC extends Kind { return: WriteFile<"./somefile.txt", this['input']> } export interface ChainIO extends EffectAtom { input: Eff chainTo: Fn } export type main = Program<[ [1, 2, 3] extends infer Res ? Print : never, Print<"bye bye">, ReadFile<"./.gitignore">, ChainIO< ReadFile<"./default.nix">, WriteFileC >, ]>