aboutsummaryrefslogtreecommitdiff
path: root/src/Data/Mili.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Data/Mili.hs')
-rw-r--r--src/Data/Mili.hs45
1 files changed, 12 insertions, 33 deletions
diff --git a/src/Data/Mili.hs b/src/Data/Mili.hs
index c10b24f..de709f1 100644
--- a/src/Data/Mili.hs
+++ b/src/Data/Mili.hs
@@ -3,7 +3,6 @@
module Data.Mili
( Term(..)
, Nat(..)
- , foldM
, fold
, shift
) where
@@ -44,31 +43,6 @@ instance Show Term where
. showString ", "
. shows w
-foldM
- :: Monad m
- => (Int -> Term -> m Term)
- -> (Term -> Term -> m Term)
- -> (Int -> m Term)
- -> (Nat -> m Term)
- -> (Term -> Term -> Term -> Term -> Term -> m Term)
- -> Term
- -> m Term
-foldM abs app lvl num rec (Abs d m) = foldM abs app lvl num rec m >>= abs d
-foldM abs app lvl num rec (App a b) = do
- a' <- foldM abs app lvl num rec a
- b' <- foldM abs app lvl num rec b
- app a' b'
-foldM _ _ lvl _ _ (Lvl i ) = pure i >>= lvl
-foldM _ _ _ num _ (Num Z ) = pure Z >>= num
-foldM abs app lvl num rec (Num (S m)) = foldM abs app lvl num rec m >>= num . S
-foldM abs app lvl num rec (Rec t1 t2 u v w) = do
- t1' <- foldM abs app lvl num rec t1
- t2' <- foldM abs app lvl num rec t2
- u' <- foldM abs app lvl num rec u
- v' <- foldM abs app lvl num rec v
- w' <- foldM abs app lvl num rec w
- rec t1' t2' u' v' w'
-
fold
:: (Int -> Term -> Term)
-> (Term -> Term -> Term)
@@ -77,13 +51,18 @@ fold
-> (Term -> Term -> Term -> Term -> Term -> Term)
-> Term
-> Term
-fold abs app lvl num rec term = runIdentity $ foldM
- (\d m -> pure $ abs d m)
- (\a b -> pure $ app a b)
- (pure . lvl)
- (pure . num)
- (\t1 t2 u v w -> pure $ rec t1 t2 u v w)
- term
+fold abs app lvl num rec (Abs l m) = abs l $ fold abs app lvl num rec m
+fold abs app lvl num rec (App a b) =
+ app (fold abs app lvl num rec a) (fold abs app lvl num rec b)
+fold _ _ lvl _ _ (Lvl n ) = lvl n
+fold _ _ _ num _ (Num Z ) = num Z
+fold abs app lvl num rec (Num (S t)) = num $ S $ fold abs app lvl num rec t
+fold abs app lvl num rec (Rec t1 t2 u v w) = rec
+ (fold abs app lvl num rec t1)
+ (fold abs app lvl num rec t2)
+ (fold abs app lvl num rec u)
+ (fold abs app lvl num rec v)
+ (fold abs app lvl num rec w)
shift :: Int -> Term -> Term
shift 0 = id