on master help sign in
Stuck with builders
commit1194bb8f230d7383f27b8860dcef2a8522b11e0c authorAleksey Uimanov <s9gf4ult@gmail.com> dateTue 9 Jul 2019, 12:37 (7 years ago) parent0aa8b99
2 files changed+36−28
katip/src/Katip/Core.hs+13−8 katip/src/Katip/Scribes/Handle.hs+23−20
katip/src/Katip/Core.hs+13−8
@@ -31,6 +31,7 @@ import qualified Control.Concurrent.STM.TBQueue as BQ
3131import Control.Exception.Safe
3232import Control.Monad (unless, void, when)
3333import Control.Monad.Base
34+import Data.Text.Encoding as T
3435#if MIN_VERSION_base(4, 9, 0)
3536import qualified Control.Monad.Fail as MF
3637#endif
@@ -55,6 +56,7 @@ import qualified Control.Monad.Trans.Writer.Strict as Strict (WriterT,
5556import Data.Aeson (FromJSON (..), ToJSON (..),
5657 object)
5758import qualified Data.Aeson as A
59+import qualified Data.ByteString.Builder as B
5860import Data.Foldable as FT
5961import qualified Data.HashMap.Strict as HM
6062import Data.List
@@ -65,7 +67,6 @@ import Data.String
6567import Data.String.Conv
6668import Data.Text (Text)
6769import qualified Data.Text as T
68−import qualified Data.Text.Lazy.Builder as B
6970import Data.Time
7071import GHC.Generics hiding (to)
7172#if MIN_VERSION_base(4, 8, 0)
@@ -199,13 +200,15 @@ instance FromJSON Verbosity where
199200 _ -> fail $ "Invalid Verbosity " ++ toS s
200201
201202
203+
204+
202205-------------------------------------------------------------------------------
203206-- | Log message with Builder underneath; use '<>' to concat in O(1).
204207newtype LogStr = LogStr { unLogStr :: B.Builder }
205− deriving (Generic, Show, Eq)
208+ deriving (Generic)
206209
207210instance IsString LogStr where
208− fromString = LogStr . B.fromString
211+ fromString = LogStr . logStrText . T.pack
209212
210213
211214instance Semigroup LogStr where
@@ -217,18 +220,20 @@ instance Monoid LogStr where
217220 mempty = LogStr mempty
218221
219222
220−instance FromJSON LogStr where
221− parseJSON = A.withText "LogStr" parseLogStr
222− where
223− parseLogStr = return . LogStr . B.fromText
223+-- instance FromJSON LogStr where
224+-- parseJSON = A.withText "LogStr" parseLogStr
225+-- where
226+-- parseLogStr = return . LogStr . B.fromText
224227
225228-------------------------------------------------------------------------------
226229-- | Pack any string-like thing into a 'LogStr'. This will
227230-- automatically work on 'String', 'ByteString', 'Text' and any of the
228231-- lazy variants.
229232logStr :: StringConv a Text => a -> LogStr
230−logStr t = LogStr (B.fromText $ toS t)
233+logStr t = logStrText . toS
231234
235+logStrText :: Text -> LogStr
236+logStrText = LogStr . B.byteString . T.encodeUtf8
232237
233238-------------------------------------------------------------------------------
234239-- | Shorthand for 'logStr'
katip/src/Katip/Scribes/Handle.hs+23−20
@@ -4,15 +4,17 @@ module Katip.Scribes.Handle where
44import Control.Applicative as A
55import Control.Concurrent
66import Control.Exception (bracket_, finally)
7+import Data.ByteString.Lazy as BL (hPutStr)
8+import Data.ByteString.Builder as B
79import Data.Aeson
8−import Data.Text.Lazy (toStrict)
9−import Data.Text.Lazy.Encoding (decodeUtf8)
10+import Data.Text as T (pack)
11+import Data.Text.Encoding as T
12+import Data.Text.Lazy as TL (toStrict)
13+import Data.Text.Lazy.Encoding as TL (decodeUtf8)
1014import qualified Data.HashMap.Strict as HM
1115import Data.Monoid as M
1216import Data.Scientific as S
1317import Data.Text (Text)
14−import Data.Text.Lazy.Builder
15−import Data.Text.Lazy.IO as T
1618import System.IO
1719-------------------------------------------------------------------------------
1820import Katip.Core
@@ -20,23 +22,26 @@ import Katip.Format.Time (formatAsLogTime)
2022-------------------------------------------------------------------------------
2123
2224
25+
26+fromText :: Text -> Builder
27+fromText = B.byteString . T.encodeUtf8
28+
2329-------------------------------------------------------------------------------
2430brackets :: Builder -> Builder
25−brackets m = fromText "[" M.<> m <> fromText "]"
26−
31+brackets m = fromText "[" <> m <> fromText "]"
2732
2833-------------------------------------------------------------------------------
2934getKeys :: LogItem s => Verbosity -> s -> [Builder]
30−getKeys verb a = concat (renderPair A.<$> HM.toList (payloadObject verb a))
35+getKeys verb a = HM.toList (payloadObject verb a) >>= renderPair
3136 where
3237 renderPair :: (Text, Value) -> [Builder]
3338 renderPair (k,v) =
3439 case v of
3540 Object o -> concat [renderPair (k <> "." <> k', v') | (k', v') <- HM.toList o]
36− String t -> [fromText (k <> ":" <> t)]
37− Number n -> [fromText (k <> ":") <> fromString (formatNumber n)]
38− Bool b -> [fromText (k <> ":") <> fromString (show b)]
39− Null -> [fromText (k <> ":null")]
41+ String t -> [fromText k <> string7 ":" <> fromText t]
42+ Number n -> [fromText k <> string7 ":" <> string7 (formatNumber n)]
43+ Bool b -> [fromText k <> string7 ":" <> string7 (show b)]
44+ Null -> [fromText k <> string7 ":null"]
4045 _ -> mempty -- Can't think of a sensible way to handle arrays
4146 formatNumber :: Scientific -> String
4247 formatNumber n =
@@ -77,14 +82,12 @@ mkHandleScribeWithFormatter :: (forall a . LogItem a => ItemFormatter a)
7782 -> Verbosity
7883 -> IO Scribe
7984mkHandleScribeWithFormatter itemFormatter cs h permitF verb = do
80− hSetBuffering h LineBuffering
8185 colorize <- case cs of
8286 ColorIfTerminal -> hIsTerminalDevice h
8387 ColorLog b -> return b
8488 lock <- newMVar ()
85− let logger i@Item{..} = do
86− bracket_ (takeMVar lock) (putMVar lock ()) $
87− T.hPutStrLn h $ toLazyText $ itemFormatter colorize verb i
89+ let logger i@Item{..} = withMVar lock $ \() -> do
90+ BL.hPutStr h $ toLazyByteString $ itemFormatter colorize verb i
8891 return $ Scribe logger (hFlush h) permitF
8992
9093
@@ -107,7 +110,7 @@ mkFileScribe f permitF verb = do
107110-- format.
108111--
109112-- See `bracketFormat` and `jsonFormat` for examples.
110−type ItemFormatter a = Bool -> Verbosity -> Item a -> Builder
113+type ItemFormatter a = Bool -> Verbosity -> Item a -> B.Builder
111114
112115
113116formatItem :: LogItem a => ItemFormatter a
@@ -125,11 +128,11 @@ bracketFormat withColor verb Item{..} =
125128 brackets nowStr <>
126129 brackets (mconcat $ map fromText $ intercalateNs _itemNamespace) <>
127130 brackets (fromText (renderSeverity' _itemSeverity)) <>
128− brackets (fromString _itemHost) <>
129− brackets ("PID " <> fromString (show _itemProcess)) <>
131+ brackets (fromText (T.pack _itemHost)) <>
132+ brackets ("PID " <> fromText (T.pack $ show _itemProcess)) <>
130133 brackets ("ThreadId " <> fromText (getThreadIdText _itemThread)) <>
131134 mconcat ks <>
132− maybe mempty (brackets . fromString . locationToString) _itemLoc <>
135+ maybe mempty (brackets . fromText . T.pack . locationToString) _itemLoc <>
133136 fromText " " <> (unLogStr _itemMessage)
134137 where
135138 nowStr = fromText (formatAsLogTime _itemTime)
@@ -148,7 +151,7 @@ jsonFormat :: LogItem a => ItemFormatter a
148151jsonFormat withColor verb i =
149152 fromText $
150153 colorBySeverity withColor (_itemSeverity i) $
151− toStrict $ decodeUtf8 $ encode $ itemJson verb i
154+ toStrict $ TL.decodeUtf8 $ encode $ itemJson verb i
152155
153156-- | Color a text message based on `Severity`. `ErrorS` and more severe errors
154157-- are colored red, `WarningS` is colored yellow, and all other messages are