From efe0ab336144d2d965bf355db02762f5cf539c7f Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Sat, 14 Jan 2023 10:37:51 +0530 Subject: feat: adds func to try/catch --- examples/file.ts | 13 +++++++------ src/eval-env/builtins.ts | 18 +++++++++--------- stdlib/effect.ts | 2 +- stdlib/exception.ts | 4 ++-- stdlib/util.ts | 9 +++++++-- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/examples/file.ts b/examples/file.ts index 2cc2b7a..5af04da 100644 --- a/examples/file.ts +++ b/examples/file.ts @@ -7,11 +7,12 @@ interface PrintK extends Kind1 { return: PutStringLn } -interface ConstK extends Kind1 { - return: Val -} - export type main = [ - Bind, PrintK>, - Bind, ConstK<'hello world'>>, PrintK> + Bind, () => + PutStringLn>, + + Try< + Bind, PrintK>, + () => PutStringLn<`ERROR: ${M}`> + > ] diff --git a/src/eval-env/builtins.ts b/src/eval-env/builtins.ts index f67fcc6..ed94943 100644 --- a/src/eval-env/builtins.ts +++ b/src/eval-env/builtins.ts @@ -31,7 +31,12 @@ const applyFunc = (ctx: Ctx, fn: Type | undefined, val: string): Type => { const typeParameters = functionNode.getTypeParameters() ?? [] if (typeParameters.length > 0) { - typeParameters[0]?.getConstraint()?.replaceWithText(val) + const constraint = typeParameters[0]?.getConstraint() + if (constraint) { + constraint?.replaceWithText(val) + } else { + typeParameters[0]?.setConstraint(val) + } } return resValueNode?.getType() @@ -126,9 +131,7 @@ export default (ctx: Ctx, args: Type[]) => ({ const resultType = applyFunc(ctx, chainToKind, `(${ctx.getResultExpr(resultKey)})['output']`) - const res = await ctx.evaluateType(ctx, resultType) - - return res + return ctx.evaluateType(ctx, resultType) }, Try: async () => { @@ -139,11 +142,8 @@ export default (ctx: Ctx, args: Type[]) => ({ return await ctx.evaluateType(ctx, effTyp) } catch (e) { const error = JSON.stringify((e as any)?.message ?? e) - const catchResExpr = `(${ctx.typeToString( - catchK - )} & { input: ${error} })['return']` - const [resultKey, _] = ctx.createResult(catchResExpr) - return [resultKey] + const resultType = applyFunc(ctx, catchK, error) + return ctx.evaluateType(ctx, resultType) } }, diff --git a/stdlib/effect.ts b/stdlib/effect.ts index 0662d00..341a620 100644 --- a/stdlib/effect.ts +++ b/stdlib/effect.ts @@ -7,7 +7,7 @@ export interface Kind1 { return: Out } -type Func +export type Func = Kind1 | (<_T extends Inp>() => Out) diff --git a/stdlib/exception.ts b/stdlib/exception.ts index ddb980c..d137a87 100644 --- a/stdlib/exception.ts +++ b/stdlib/exception.ts @@ -1,5 +1,5 @@ -import { Effect, Kind1 } from './effect' +import { Effect, Func } from './effect' -export interface Try<_E extends Effect, _Catch extends Kind1> extends Effect {} +export interface Try<_E extends Effect, _Catch extends Func> extends Effect {} export interface Throw<_E> extends Effect {} diff --git a/stdlib/util.ts b/stdlib/util.ts index 20a41fb..cd25d7b 100644 --- a/stdlib/util.ts +++ b/stdlib/util.ts @@ -2,12 +2,17 @@ import { Kind1 } from './effect' export type Let any> = ReturnType -export type Apply = (K & { input: Val })['return'] +export type ApplyK = (K & { input: Val })['return'] -export interface Id extends Kind1 { +export type Id = () => T +export interface IdK extends Kind1 { return: this['input'] } +export interface ConstK extends Kind1 { + return: Val +} + type ADTDescr = { _type: string; value: any } interface ADTConstructor extends Kind1 { -- cgit v1.3.1