aboutsummaryrefslogtreecommitdiff
path: root/src/util.ts
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2023-12-15 22:28:31 +0530
committerAkshay Nair <phenax5@gmail.com>2023-12-15 22:28:31 +0530
commit3d91b8c0fe73d24e3bcf13e7d7e8079f58975500 (patch)
tree7767b4357f3533764068b615b8f0e04234b230fc /src/util.ts
parent505916f3ddcdfc492f95e409d233b96424df3b1a (diff)
downloadts-theorem-provinator-3d91b8c0fe73d24e3bcf13e7d7e8079f58975500.tar.gz
ts-theorem-provinator-3d91b8c0fe73d24e3bcf13e7d7e8079f58975500.zip
feat: adds monadic/dyadic operators
Diffstat (limited to '')
-rw-r--r--src/util.ts18
1 files changed, 12 insertions, 6 deletions
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 Op> =
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<a>} ${O['op']} ${b})`
- : O extends { op: string, a: infer a extends string, b: infer b extends COp } ? `(${a} ${O['op']} ${OpToStr<b>})`
- : O extends { op: string, a: infer a extends COp, b: infer b extends COp } ? `(${OpToStr<a>} ${O['op']} ${OpToStr<b>})`
+ : O extends { op: string, a: infer a extends DyadicOp, b: infer b extends string } ? `(${OpToStr<a>} ${O['op']} ${b})`
+ : O extends { op: string, a: infer a extends string, b: infer b extends DyadicOp } ? `(${a} ${O['op']} ${OpToStr<b>})`
+ : O extends { op: string, a: infer a extends DyadicOp, b: infer b extends DyadicOp } ? `(${OpToStr<a>} ${O['op']} ${OpToStr<b>})`
+ : O extends { op: string, a: infer a extends string } ? `${O['op']}(${a})`
+ : O extends { op: string, a: infer a extends DyadicOp } ? `${O['op']}(${OpToStr<a>})`
: never;
type RwType = 'rewrite' | 'imperative';
@@ -32,12 +35,15 @@ export type ApplyRewrite<O extends Op, R extends RewriteBase> =
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<O['a'], R> extends O['a']
? (ApplyRewrite<O['b'], R> extends O['b'] ? O
: Omit<O, 'b'> & { b: ApplyRewrite<O['b'], R> })
: Omit<O, 'a'> & { a: ApplyRewrite<O['a'], R> }
)
+ : O extends MonadicOp ? (
+ ApplyRewrite<O['a'], R> extends O['a'] ? O : Omit<O, 'a'> & { a: ApplyRewrite<O['a'], R> }
+ )
: never;
export type ChainRewrites<Rws extends RewriteBase[], O extends Op> =