diff options
author | Tom Smeding <tom@tomsmeding.com> | 2024-12-06 19:54:53 +0100 |
---|---|---|
committer | Tom Smeding <tom@tomsmeding.com> | 2024-12-06 19:54:53 +0100 |
commit | 3e266262ebe65bd5d775711b4d05bc9670a38a47 (patch) | |
tree | bf0fff187e53adb8a4f45b3d7c70c97566c1e141 /src/AST.hs | |
parent | 40a0abca1cedcdd930bb33d1874b7922443e5a8c (diff) |
UnMonoid
Diffstat (limited to 'src/AST.hs')
-rw-r--r-- | src/AST.hs | 27 |
1 files changed, 17 insertions, 10 deletions
@@ -396,17 +396,24 @@ emap f arr = (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) $ +ezipWith :: Ex (b : a : env) c -> Ex env (TArr n a) -> Ex env (TArr n b) -> Ex env (TArr n c) +ezipWith f arr1 arr2 = + let STArr n t1 = typeOf arr1 + STArr _ t2 = typeOf arr2 + in ELet ext arr1 $ + ELet ext (weakenExpr WSink arr2) $ 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)) + ELet ext (EIdx ext (EVar ext (STArr n t1) (IS (IS IZ))) + (EVar ext (tTup (sreplicate n tIx)) IZ)) $ + ELet ext (EIdx ext (EVar ext (STArr n t2) (IS (IS IZ))) + (EVar ext (tTup (sreplicate n tIx)) (IS IZ))) $ + weakenExpr (WCopy (WCopy (WSink .> WSink .> WSink))) f + +ezip :: Ex env (TArr n a) -> Ex env (TArr n b) -> Ex env (TArr n (TPair a b)) +ezip arr1 arr2 = + let STArr _ t1 = typeOf arr1 + STArr _ t2 = typeOf arr2 + in ezipWith (EPair ext (EVar ext t1 (IS IZ)) (EVar ext t2 IZ)) arr1 arr2 eif :: Ex env (TScal TBool) -> Ex env a -> Ex env a -> Ex env a eif a b c = ECase ext (EOp ext OIf a) (weakenExpr WSink b) (weakenExpr WSink c) |