summaryrefslogtreecommitdiff
path: root/src/AST.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/AST.hs')
-rw-r--r--src/AST.hs21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/AST.hs b/src/AST.hs
index 9f1da7a..71001e7 100644
--- a/src/AST.hs
+++ b/src/AST.hs
@@ -355,3 +355,24 @@ eidxEq (SS n) a b
(ESnd ext (EVar ext ty IZ))))
(eidxEq n (EFst ext (EVar ext ty (IS IZ)))
(EFst ext (EVar ext ty IZ)))
+
+emap :: Ex (a : env) b -> Ex env (TArr n a) -> Ex env (TArr n b)
+emap f arr =
+ let STArr n t = typeOf arr
+ in ELet ext arr $
+ EBuild ext n (EShape ext (EVar ext (STArr n t) IZ)) $
+ ELet ext (EIdx ext (EVar ext (STArr n t) (IS IZ))
+ (EVar ext (tTup (sreplicate n tIx)) IZ)) $
+ weakenExpr (WCopy (WSink .> WSink)) f
+
+ezip :: Ex env (TArr n a) -> Ex env (TArr n b) -> Ex env (TArr n (TPair a b))
+ezip a b =
+ let STArr n t1 = typeOf a
+ STArr _ t2 = typeOf b
+ in ELet ext a $
+ ELet ext (weakenExpr WSink b) $
+ EBuild ext n (EShape ext (EVar ext (STArr n t1) (IS IZ))) $
+ EPair ext (EIdx ext (EVar ext (STArr n t1) (IS (IS IZ)))
+ (EVar ext (tTup (sreplicate n tIx)) IZ))
+ (EIdx ext (EVar ext (STArr n t2) (IS IZ))
+ (EVar ext (tTup (sreplicate n tIx)) IZ))