From 3d91b8c0fe73d24e3bcf13e7d7e8079f58975500 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 15 Dec 2023 22:28:31 +0530 Subject: feat: adds monadic/dyadic operators --- src/util.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src/util.ts') diff --git a/src/util.ts b/src/util.ts index da6d637..a4dd2e9 100644 --- a/src/util.ts +++ b/src/util.ts @@ -1,13 +1,16 @@ -type COp = { op: string; a: Op; b: Op } -export type Op = string | COp; +type DyadicOp = { op: string; a: Op; b: Op } +type MonadicOp = { op: string; a: Op } +export type Op = string | MonadicOp | DyadicOp; export type OpToStr = O extends string ? O : O extends { op: string, a: infer a extends string, b: infer b extends string } ? `(${a} ${O['op']} ${b})` - : O extends { op: string, a: infer a extends COp, b: infer b extends string } ? `(${OpToStr} ${O['op']} ${b})` - : O extends { op: string, a: infer a extends string, b: infer b extends COp } ? `(${a} ${O['op']} ${OpToStr})` - : O extends { op: string, a: infer a extends COp, b: infer b extends COp } ? `(${OpToStr} ${O['op']} ${OpToStr})` + : O extends { op: string, a: infer a extends DyadicOp, b: infer b extends string } ? `(${OpToStr} ${O['op']} ${b})` + : O extends { op: string, a: infer a extends string, b: infer b extends DyadicOp } ? `(${a} ${O['op']} ${OpToStr})` + : O extends { op: string, a: infer a extends DyadicOp, b: infer b extends DyadicOp } ? `(${OpToStr} ${O['op']} ${OpToStr})` + : O extends { op: string, a: infer a extends string } ? `${O['op']}(${a})` + : O extends { op: string, a: infer a extends DyadicOp } ? `${O['op']}(${OpToStr})` : never; type RwType = 'rewrite' | 'imperative'; @@ -32,12 +35,15 @@ export type ApplyRewrite = R['type'] extends 'imperative' ? (R & { left: O })['right'] : O extends R['left'] ? R['right'] : O extends string ? O - : O extends { a: Op, b: Op, op: string } ? ( + : O extends DyadicOp ? ( ApplyRewrite extends O['a'] ? (ApplyRewrite extends O['b'] ? O : Omit & { b: ApplyRewrite }) : Omit & { a: ApplyRewrite } ) + : O extends MonadicOp ? ( + ApplyRewrite extends O['a'] ? O : Omit & { a: ApplyRewrite } + ) : never; export type ChainRewrites = -- cgit v1.3.1