packages feed

she-0.1: src/DeBruijn.lhs

> module DeBruijn where

> import Data.List
> import Control.Applicative

> import Parsley
> import HaLay

> deBruijnMu :: [String] -> [Tok] -> Maybe [Tok]
> deBruijnMu xs (B Sqr ss : ts)
>   = (:) <$> parse jig ss <*> pure (munge (deBruijnMu xs) ts) where
>     jig :: P Tok Tok
>     jig = teq (Sym ".") *>
>           (shf xs <$> some (lid <* teq (Sym ".")) <*> pRest)
>     shf xs [] ts = B Rnd (wang xs : KW "in" : Spc " " :
>                           munge (deBruijnMu xs) ts)
>     shf xs (y : ys) ts = shf (y : xs) ys ts
>     wang xs = L "let"  ([Ope Crl] :
>                        intersperse [Semi] (zipWith dang xs [0..]) ++
>                        [[Clo Crl]])
>     dang x i = [Lid x, Sym "=", Lit (show i)]
> deBruijnMu _ _ = Nothing

> deBruijn :: [[Tok]] -> [[Tok]]
> deBruijn = map (munge (deBruijnMu []))