----------------------------------------------------------------
--
-- | Compilation
--   Monad and combinators for quickly assembling simple
--   compilers.
--
-- @Control\/Compilation\/String.hs@
--
--   A generic compilation monad and combinators for quickly
--   assembling simple compilers that emit an ASCII string
--   representation of the target language (well-suited for
--   direct syntax translators).
--

----------------------------------------------------------------
--

module Control.Compilation.String
  where
  
import Control.Compilation

----------------------------------------------------------------
-- | Combinators and functions for compiling directly into a raw
--   ASCII string.

indent :: Compilation String ()
indent = Compilation $ \(State f i m n s) -> (State f ("  " ++ i) m n s, ())

unindent :: Compilation String ()
unindent = Compilation $ \(State f i m n s) -> (State f (drop (min (length i) 2) i) m n s, ())

space :: Compilation String ()
space = Compilation $ \(State f i m n s) -> (State f i m n (s ++ " "), ())

spaces :: Int -> Compilation String ()
spaces k = Compilation $ \(State f i m n s) -> (State f i m n (s ++ (take k $ repeat ' ')), ())

newline :: Compilation String ()
newline = Compilation $ \(State f i m n s) -> (State f i m n (s ++ "\n" ++ i), ())

newlines :: Int -> Compilation String ()
newlines k = Compilation $ \(State f i m n s) -> (State f i m n (s ++ (take k $ repeat '\n') ++ i), ())

string :: String -> Compilation String ()
string s' = Compilation $ \(State f i m n s) -> (State f i m n (s ++ s'), ())

raw :: String -> Compilation String ()
raw = string

--eof