Sync symantic with symantic-document.
[haskell/symantic.git] / symantic-document / Language / Symantic / Document / Term / IO.hs
index 5bbe4df0528c27a02c19caf6811b8283d340902c..e3ba2500670b417a89eda4eccb3cf1e96a17f7d7 100644 (file)
@@ -6,20 +6,17 @@ module Language.Symantic.Document.Term.IO
 import Control.Applicative (Applicative(..))
 import Data.Bool
 import Data.Function (($), (.), id)
-import Data.Int (Int)
 import Data.Monoid (Monoid(..))
 import Data.Ord (Ord(..))
 import Data.Semigroup (Semigroup(..))
 import Data.String (IsString(..))
 import GHC.Exts (IsList(..))
-import Prelude ((+), pred)
+import Prelude (pred, fromIntegral, Num(..))
 import System.Console.ANSI
 import System.IO (IO)
 import Text.Show (Show(..))
 import qualified Data.List as List
-import qualified Data.Text as Text
 import qualified Data.Text.IO as Text
-import qualified Data.Text.Lazy as TL
 import qualified Data.Text.Lazy.IO as TL
 import qualified System.IO as IO
 
@@ -28,13 +25,13 @@ import Language.Symantic.Document.Sym
 -- * Type 'Reader'
 data Reader
  =   Reader
- {   reader_indent      :: !(Indent TermIO) -- ^ Current indentation level, used by 'newline'.
- ,   reader_newline     :: TermIO           -- ^ How to display 'newline'.
- ,   reader_wrap_column :: !(Column TermIO) -- ^ 'Column' after which 'wrap' breaks on a 'breakpoint' or 'breakspace'.
- ,   reader_sgr         :: ![SGR]           -- ^ Active ANSI codes.
- ,   reader_handle      :: !IO.Handle       -- ^ Where to write.
- ,   reader_colorable   :: !Bool            -- ^ Whether colors are activated or not.
- ,   reader_decorable   :: !Bool            -- ^ Whether decorations are activated or not.
+ {   reader_indent      :: !Indent    -- ^ Current indentation level, used by 'newline'.
+ ,   reader_newline     :: TermIO     -- ^ How to display 'newline'.
+ ,   reader_wrap_column :: !Column    -- ^ 'Column' after which 'wrap' breaks on a 'breakpoint' or 'breakspace'.
+ ,   reader_sgr         :: ![SGR]     -- ^ Active ANSI codes.
+ ,   reader_handle      :: !IO.Handle -- ^ Where to write.
+ ,   reader_colorable   :: !Bool      -- ^ Whether colors are activated or not.
+ ,   reader_decorable   :: !Bool      -- ^ Whether decorations are activated or not.
  }
 
 -- | Default 'Reader'.
@@ -42,7 +39,7 @@ defReader :: Reader
 defReader = Reader
  { reader_indent      = 0
  , reader_newline     = newlineWithIndent
- , reader_wrap_column = 80
+ , reader_wrap_column = Nat 80
  , reader_sgr         = []
  , reader_handle      = IO.stdout
  , reader_colorable   = True
@@ -50,7 +47,7 @@ defReader = Reader
  }
 
 -- * Type 'State'
-type State = Column TermIO
+type State = Column
 
 -- | Default 'State'.
 defState :: State
@@ -64,9 +61,6 @@ newtype TermIO
                   (State -> IO () -> IO ()) -> -- should-wrap continuation
                   IO () }
 
-type instance Column TermIO = Int
-type instance Indent TermIO = Int
-
 -- | Write a 'TermIO'.
 runTermIO :: IO.Handle -> TermIO -> IO ()
 runTermIO h (TermIO p) = p defReader{reader_handle=h} defState oko oko
@@ -91,7 +85,7 @@ instance Monoid TermIO where
 instance IsString TermIO where
        fromString = string
 
-writeH :: Column TermIO -> (IO.Handle -> IO ()) -> TermIO
+writeH :: Column -> (IO.Handle -> IO ()) -> TermIO
 writeH len t =
        TermIO $ \ro st ok ko ->
                let newCol = st + len in
@@ -101,9 +95,9 @@ writeH len t =
 instance Textable TermIO where
        empty     = TermIO $ \_ro st ok _ko -> ok st mempty
        charH   t = writeH 1 (`IO.hPutChar` t)
-       stringH t = writeH (List.length t) (`IO.hPutStr` t)
-       textH   t = writeH (Text.length t) (`Text.hPutStr` t)
-       ltextH  t = writeH (intOfInt64 $ TL.length t) (`TL.hPutStr` t)
+       stringH t = writeH (length t) (`IO.hPutStr` t)
+       textH   t = writeH (length t) (`Text.hPutStr` t)
+       ltextH  t = writeH (length t) (`TL.hPutStr` t)
        int       = stringH . show
        integer   = stringH . show
        replicate cnt p | cnt <= 0  = empty
@@ -120,7 +114,7 @@ instance Alignable TermIO where
        newlineWithIndent = TermIO $ \ro@Reader{reader_handle=h} _st ok _ko ->
                ok (reader_indent ro) $ do
                        IO.hPutChar h '\n'
-                       IO.hPutStr h $ List.replicate (reader_indent ro) ' '
+                       IO.hPutStr h $ List.replicate (fromIntegral $ reader_indent ro) ' '
 instance Wrapable TermIO where
        ifWrap y x = TermIO $ \ro st ok ko ->
                unTermIO x ro st ok (\_sx _tx -> unTermIO y ro st ok ko)