module CharSeq (
CSeq,
cNil, cAppend, cIndent, cNL, cStr, cCh, -- cAbove, cBeside, cConcat,
cShow
) where
cShow :: CSeq -> [Char]
cNil :: CSeq
cAppend :: CSeq -> CSeq -> CSeq
-- UNUSED: cConcat :: [CSeq] -> CSeq
cIndent :: Int -> CSeq -> CSeq
cNL :: CSeq
cStr :: [Char] -> CSeq
cCh :: Char -> CSeq
{- old:
cAbove :: CSeq -> CSeq -> CSeq -- Separate them with a newline unless
-- one or t'other is empty.
cBeside :: CSeq -> CSeq -> CSeq -- Similar; separates with a space.
-}
data CSeq = CNil
| CAppend CSeq CSeq
| CIndent Int CSeq
| CNewline
| CStr [Char]
| CCh Char
--deriving ()
cNil = CNil
-- cAppend CNil cs2 = cs2
-- cAppend cs1 CNil = cs1
cAppend cs1 cs2 = CAppend cs1 cs2
-- cIndent n CNil = CNil
cIndent n cs = CIndent n cs
cNL = CNewline
cStr = CStr
cCh = CCh
-- UNUSED: cConcat = foldr cAppend CNil
{- old:
cAbove CNil cs2 = cs2
cAbove cs1 cs2 = CAppend cs1 (case cs2 of CNil -> CNil; other -> CAppend CNewline cs2)
-}
{- old:
cBeside CNil cs2
= case cs2 of
CIndent n cs3 -> CIndent (n-1) cs3
other -> cs2 -- oh well...
cBeside cs1 cs2 = CAppend cs1 (case cs2 of CNil -> CNil; other -> CAppend (CCh ' ') cs2)
-}
cShow seq = flatten 0 True seq []
flatten :: Int -- Indentation
-> Bool -- True => just had a newline
-> CSeq -- Current seq to flatten
-> [(Int,CSeq)] -- Work list with indentation
-> String
flatten n nlp CNil seqs = flattenS nlp seqs
flatten n nlp (CAppend seq1 seq2) seqs = flatten n nlp seq1 ((n,seq2) : seqs)
flatten n nlp (CIndent n' seq) seqs = flatten (n'+n) nlp seq seqs
flatten n nlp CNewline seqs = '\n' : flattenS True seqs
flatten n False (CStr s) seqs = s ++ flattenS False seqs
flatten n False (CCh c) seqs = c : flattenS False seqs
flatten n True (CStr s) seqs = mkIndent n (s ++ flattenS False seqs)
flatten n True (CCh c) seqs = mkIndent n (c : flattenS False seqs)
flattenS :: Bool -> [(Int, CSeq)] -> String
flattenS nlp [] = ""
flattenS nlp ((col,seq):seqs) = flatten col nlp seq seqs
mkIndent :: Int -> String -> String
mkIndent 0 s = s
mkIndent n s
= if (n >= 8) then '\t' : mkIndent (n-8) s
else ' ' : mkIndent (n-1) s
-- A little Unix-y; ToDo: something?
|