{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
module Turtle.Format (
Format (..)
, (%)
, format
, printf
, eprintf
, makeFormat
, w
, d
, u
, o
, x
, f
, e
, g
, s
, l
, fp
, utc
, repr
) where
import Control.Category (Category(..))
import Control.Monad.IO.Class (MonadIO(..))
import Data.Monoid ((<>))
import Data.String (IsString(..))
import Data.Text (Text, pack)
import Data.Time (UTCTime)
import Data.Word
import Numeric (showEFloat, showFFloat, showGFloat, showHex, showOct)
import Prelude hiding ((.), id)
import qualified System.IO as IO
import Turtle.Line (Line)
import qualified Data.Text.IO as Text
import qualified Turtle.Line
newtype Format a b = Format { Format a b -> (Text -> a) -> b
(>>-) :: (Text -> a) -> b }
instance Category Format where
id :: Format a a
id = ((Text -> a) -> a) -> Format a a
forall a b. ((Text -> a) -> b) -> Format a b
Format (\Text -> a
return_ -> Text -> a
return_ Text
"")
Format b c
fmt1 . :: Format b c -> Format a b -> Format a c
. Format a b
fmt2 = ((Text -> a) -> c) -> Format a c
forall a b. ((Text -> a) -> b) -> Format a b
Format (\Text -> a
return_ ->
Format b c
fmt1 Format b c -> (Text -> b) -> c
forall a b. Format a b -> (Text -> a) -> b
>>- \Text
str1 ->
Format a b
fmt2 Format a b -> (Text -> a) -> b
forall a b. Format a b -> (Text -> a) -> b
>>- \Text
str2 ->
Text -> a
return_ (Text
str1 Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
str2) )
(%) :: Format b c -> Format a b -> Format a c
% :: Format b c -> Format a b -> Format a c
(%) = Format b c -> Format a b -> Format a c
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
(.)
instance (a ~ b) => IsString (Format a b) where
fromString :: String -> Format a b
fromString String
str = ((Text -> a) -> a) -> Format a a
forall a b. ((Text -> a) -> b) -> Format a b
Format (\Text -> a
return_ -> Text -> a
return_ (String -> Text
pack String
str))
format :: Format Text r -> r
format :: Format Text r -> r
format Format Text r
fmt = Format Text r
fmt Format Text r -> (Text -> Text) -> r
forall a b. Format a b -> (Text -> a) -> b
>>- Text -> Text
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
printf :: MonadIO io => Format (io ()) r -> r
printf :: Format (io ()) r -> r
printf Format (io ()) r
fmt = Format (io ()) r
fmt Format (io ()) r -> (Text -> io ()) -> r
forall a b. Format a b -> (Text -> a) -> b
>>- (IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> (Text -> IO ()) -> Text -> io ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Text -> IO ()
Text.putStr)
eprintf :: MonadIO io => Format (io ()) r -> r
eprintf :: Format (io ()) r -> r
eprintf Format (io ()) r
fmt = Format (io ()) r
fmt Format (io ()) r -> (Text -> io ()) -> r
forall a b. Format a b -> (Text -> a) -> b
>>- (IO () -> io ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> io ()) -> (Text -> IO ()) -> Text -> io ()
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Handle -> Text -> IO ()
Text.hPutStr Handle
IO.stderr)
makeFormat :: (a -> Text) -> Format r (a -> r)
makeFormat :: (a -> Text) -> Format r (a -> r)
makeFormat a -> Text
k = ((Text -> r) -> a -> r) -> Format r (a -> r)
forall a b. ((Text -> a) -> b) -> Format a b
Format (\Text -> r
return_ -> \a
a -> Text -> r
return_ (a -> Text
k a
a))
w :: Show a => Format r (a -> r)
w :: Format r (a -> r)
w = (a -> Text) -> Format r (a -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (String -> Text
pack (String -> Text) -> (a -> String) -> a -> Text
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> String
forall a. Show a => a -> String
show)
d :: Integral n => Format r (n -> r)
d :: Format r (n -> r)
d = (n -> Text) -> Format r (n -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (String -> Text
pack (String -> Text) -> (n -> String) -> n -> Text
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Integer -> String
forall a. Show a => a -> String
show (Integer -> String) -> (n -> Integer) -> n -> String
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. n -> Integer
forall a. Integral a => a -> Integer
toInteger)
u :: Format r (Word -> r)
u :: Format r (Word -> r)
u = Format r (Word -> r)
forall a r. Show a => Format r (a -> r)
w
o :: Format r (Word -> r)
o :: Format r (Word -> r)
o = (Word -> Text) -> Format r (Word -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (\Word
n -> String -> Text
pack (Word -> ShowS
forall a. (Integral a, Show a) => a -> ShowS
showOct Word
n String
""))
x :: Format r (Word -> r)
x :: Format r (Word -> r)
x = (Word -> Text) -> Format r (Word -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (\Word
n -> String -> Text
pack (Word -> ShowS
forall a. (Integral a, Show a) => a -> ShowS
showHex Word
n String
""))
f :: Format r (Double -> r)
f :: Format r (Double -> r)
f = (Double -> Text) -> Format r (Double -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (\Double
n -> String -> Text
pack (Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) Double
n String
""))
e :: Format r (Double -> r)
e :: Format r (Double -> r)
e = (Double -> Text) -> Format r (Double -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (\Double
n -> String -> Text
pack (Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showEFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) Double
n String
""))
g :: Format r (Double -> r)
g :: Format r (Double -> r)
g = (Double -> Text) -> Format r (Double -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat (\Double
n -> String -> Text
pack (Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showGFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6) Double
n String
""))
s :: Format r (Text -> r)
s :: Format r (Text -> r)
s = (Text -> Text) -> Format r (Text -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat Text -> Text
forall k (cat :: k -> k -> *) (a :: k). Category cat => cat a a
id
l :: Format r (Line -> r)
l :: Format r (Line -> r)
l = (Line -> Text) -> Format r (Line -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat Line -> Text
Turtle.Line.lineToText
fp :: Format r (FilePath -> r)
fp :: Format r (String -> r)
fp = (String -> Text) -> Format r (String -> r)
forall a r. (a -> Text) -> Format r (a -> r)
makeFormat String -> Text
pack
utc :: Format r (UTCTime -> r)
utc :: Format r (UTCTime -> r)
utc = Format r (UTCTime -> r)
forall a r. Show a => Format r (a -> r)
w
repr :: (Show a, IsString text) => a -> text
repr :: a -> text
repr = String -> text
forall a. IsString a => String -> a
fromString (String -> text) -> (a -> String) -> a -> text
forall k (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> String
forall a. Show a => a -> String
show