summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2024-12-06 19:54:23 +0100
committerTom Smeding <tom@tomsmeding.com>2024-12-06 19:54:23 +0100
commit40a0abca1cedcdd930bb33d1874b7922443e5a8c (patch)
tree951e5c4dc3421bc57cabb677545ed84057899d20
parent4c96a1ab3d2bd862dde977aae705a5c731d239d2 (diff)
Simplify: Reduce plus of literals
-rw-r--r--src/Simplify.hs21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/Simplify.hs b/src/Simplify.hs
index 1646213..6303716 100644
--- a/src/Simplify.hs
+++ b/src/Simplify.hs
@@ -101,6 +101,27 @@ simplify' = \case
EPlus _ e (EZero _) -> acted $ simplify' e
EOneHot _ SZ _ e -> acted $ simplify' e
+ -- equations for plus
+ EPlus STNil _ _ -> (Any True, ENil ext)
+
+ EPlus (STPair t1 t2) (EJust _ (EPair _ a1 b1)) (EJust _ (EPair _ a2 b2)) ->
+ acted $ simplify' $ EJust ext (EPair ext (EPlus t1 a1 a2) (EPlus t2 b1 b2))
+ EPlus STPair{} ENothing{} e -> acted $ simplify' e
+ EPlus STPair{} e ENothing{} -> acted $ simplify' e
+
+ EPlus (STEither t1 _) (EJust _ (EInl _ dt2 a1)) (EJust _ (EInl _ _ a2)) ->
+ acted $ simplify' $ EJust ext (EInl ext dt2 (EPlus t1 a1 a2))
+ EPlus (STEither _ t2) (EJust _ (EInr _ dt1 b1)) (EJust _ (EInr _ _ b2)) ->
+ acted $ simplify' $ EJust ext (EInr ext dt1 (EPlus t2 b1 b2))
+ EPlus STEither{} ENothing{} e -> acted $ simplify' e
+ EPlus STEither{} e ENothing{} -> acted $ simplify' e
+
+ EPlus (STMaybe t) (EJust _ e1) (EJust _ e2) ->
+ acted $ simplify' $ EJust ext (EPlus t e1 e2)
+ EPlus STMaybe{} ENothing{} e -> acted $ simplify' e
+ EPlus STMaybe{} e ENothing{} -> acted $ simplify' e
+
+ -- fallback recursion
EVar _ t i -> pure $ EVar ext t i
ELet _ a b -> ELet ext <$> simplify' a <*> simplify' b
EPair _ a b -> EPair ext <$> simplify' a <*> simplify' b