module Language.Symantic.Document.Plain where
import Control.Monad (Monad(..), replicateM_)
import Data.Function (($), (.), id)
import Data.Monoid (Monoid(..))
import Data.Semigroup (Semigroup(..))
import Data.String (IsString(..))
import System.IO (IO)
import Text.Show (Show(..))
import qualified Data.Text.IO as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Text.Lazy.Builder as TLB
import qualified System.IO as IO
import Language.Symantic.Document.Sym
newtype Plain
= Plain TLB.Builder
deriving (Show)
instance IsString Plain where
fromString = Plain . fromString
plain :: Plain -> TLB.Builder
plain (Plain d) = d
instance Semigroup Plain where
Plain x <> Plain y = Plain (x <> y)
instance Monoid Plain where
mempty = empty
mappend = (<>)
instance Doc_Text Plain where
int = Plain . fromString . show
integer = Plain . fromString . show
replicate i = Plain . TLB.fromLazyText . TL.replicate (int64OfInt i) . TLB.toLazyText . plain
char = Plain . TLB.singleton
string = Plain . fromString
text = Plain . TLB.fromText
ltext = Plain . TLB.fromLazyText
charH = char
stringH = string
textH = text
ltextH = ltext
instance Doc_Color Plain where
reverse = id
black = id
red = id
green = id
yellow = id
blue = id
magenta = id
cyan = id
white = id
blacker = id
redder = id
greener = id
yellower = id
bluer = id
magentaer = id
cyaner = id
whiter = id
onBlack = id
onRed = id
onGreen = id
onYellow = id
onBlue = id
onMagenta = id
onCyan = id
onWhite = id
onBlacker = id
onRedder = id
onGreener = id
onYellower = id
onBluer = id
onMagentaer = id
onCyaner = id
onWhiter = id
instance Doc_Decoration Plain where
bold = id
underline = id
italic = id
newtype PlainIO
= PlainIO { unPlainH :: IO.Handle -> IO () }
instance IsString PlainIO where
fromString s = PlainIO $ \h -> IO.hPutStr h t
where t = fromString s
plainIO :: PlainIO -> IO.Handle -> IO ()
plainIO (PlainIO d) = d
instance Semigroup PlainIO where
PlainIO x <> PlainIO y = PlainIO $ \h -> do {x h; y h}
instance Monoid PlainIO where
mempty = empty
mappend = (<>)
instance Doc_Text PlainIO where
empty = PlainIO $ \_ -> return ()
int i = PlainIO $ \h -> IO.hPutStr h (show i)
integer i = PlainIO $ \h -> IO.hPutStr h (show i)
replicate i d = PlainIO $ replicateM_ i . plainIO d
char x = PlainIO $ \h -> IO.hPutChar h x
string x = PlainIO $ \h -> IO.hPutStr h x
text x = PlainIO $ \h -> T.hPutStr h x
ltext x = PlainIO $ \h -> TL.hPutStr h x
charH = char
stringH = string
textH = text
ltextH = ltext
instance Doc_Color PlainIO where
reverse = id
black = id
red = id
green = id
yellow = id
blue = id
magenta = id
cyan = id
white = id
blacker = id
redder = id
greener = id
yellower = id
bluer = id
magentaer = id
cyaner = id
whiter = id
onBlack = id
onRed = id
onGreen = id
onYellow = id
onBlue = id
onMagenta = id
onCyan = id
onWhite = id
onBlacker = id
onRedder = id
onGreener = id
onYellower = id
onBluer = id
onMagentaer = id
onCyaner = id
onWhiter = id
instance Doc_Decoration PlainIO where
bold = id
underline = id
italic = id