module Language.Haskell.Lexer.Layout (layoutPre,PosToken) where
import Language.Haskell.Lexer.Tokens
import Language.Haskell.Lexer.Position
type PosToken = (Token,(Pos,String))
layoutPre :: [PosToken] -> [PosToken]
layoutPre = indent . open
open :: [PosToken] -> [PosToken]
open = open1
open1 :: [PosToken] -> [PosToken]
open1 (t1@(Reservedid,(_,"module")):ts) = t1:open2 ts
open1 (t1@(Special,(_,"{")):ts) = t1:open2 ts
open1 ts@((_,(p,_)):_) = (Open (column p),(p,"")):open2 ts
open1 [] = []
open2 :: [PosToken] -> [PosToken]
open2 (t1:ts1) | isLtoken t1 =
case ts1 of
t2@(_,(p,_)):ts2 ->
if notLBrace t2
then t1:(Open (column p),(p,"")):open2 ts1
else t1:t2:open2 ts2
[] -> t1:(Open 0,(fst (snd t1),"")):[]
where
isLtoken (Reservedid,(_,s)) = s `elem` ["let","where","do","of"]
isLtoken _ = False
notLBrace (Special,(_,"{")) = False
notLBrace _ = True
open2 (t:ts) = t:open2 ts
open2 [] = []
indent :: [PosToken] -> [PosToken]
indent (t1@(Open _,(p,_)):ts) = t1:indent2 (line p) ts
indent (t1@(_,(p,_)):ts) = (Indent (column p),(p,"")):t1:indent2 (line p) ts
indent [] = []
indent2 :: Int -> [PosToken] -> [PosToken]
indent2 r (t1@(_,(p,_)):ts) | line p==r = t1:indent2 r ts
indent2 _ ts = indent ts