{-# LANGUAGE MagicHash #-}
module Data.Emacs.Module.Doc
  ( Doc
  , mkLiteralDoc
  , mkTextDoc
  , useDocAsCString
  ) where
import Data.String
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Foreign qualified as T
import Foreign.C.String
import GHC.Exts
data Doc
  = StaticDoc Addr#
  | DynamicDoc !Text
instance Show Doc where
  show :: Doc -> String
show = \case
    DynamicDoc Text
x   -> Text -> String
forall a. Show a => a -> String
show Text
x
    StaticDoc Addr#
addr -> ShowS
forall a. Show a => a -> String
show (Addr# -> String
unpackCString# Addr#
addr)
instance IsString Doc where
  {-# INLINE fromString #-}
  fromString :: String -> Doc
fromString = String -> Doc
mkStringDoc
mkStringDoc :: String -> Doc
mkStringDoc :: String -> Doc
mkStringDoc = Text -> Doc
mkTextDoc (Text -> Doc) -> (String -> Text) -> String -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
{-# INLINE [0] mkStringDoc #-}
{-# RULES
"Doc string literal" forall s .
   mkStringDoc (unpackCString# s) = mkLiteralDoc s
 #-}
{-# INLINE mkLiteralDoc #-}
mkLiteralDoc :: Addr# -> Doc
mkLiteralDoc :: Addr# -> Doc
mkLiteralDoc = Addr# -> Doc
StaticDoc
{-# INLINE mkTextDoc #-}
mkTextDoc :: Text -> Doc
mkTextDoc :: Text -> Doc
mkTextDoc = Text -> Doc
DynamicDoc
{-# INLINE useDocAsCString #-}
useDocAsCString :: Doc -> (CString -> IO a) -> IO a
useDocAsCString :: forall a. Doc -> (CString -> IO a) -> IO a
useDocAsCString Doc
doc CString -> IO a
f = case Doc
doc of
  StaticDoc Addr#
addr -> CString -> IO a
f (Addr# -> CString
forall a. Addr# -> Ptr a
Ptr Addr#
addr)
  DynamicDoc Text
str -> Text -> (CString -> IO a) -> IO a
forall a. Text -> (CString -> IO a) -> IO a
T.withCString Text
str CString -> IO a
f