----------------------------------------------------------------------------
-- |
-- Module      :  Data.Emacs.Module.SymbolName.Internal
-- Copyright   :  (c) Sergey Vinokurov 2018
-- License     :  BSD3-style (see LICENSE)
-- Maintainer  :  serg.foo@gmail.com
----------------------------------------------------------------------------

{-# OPTIONS_HADDOCK not-home #-}

module Data.Emacs.Module.SymbolName.Internal
  ( SymbolName(..)
  , mkSymbolName
  , mkSymbolNameShortByteString
  , useSymbolNameAsCString
  ) where

import qualified Data.ByteString.Short as BSS
import qualified Data.ByteString.Char8 as C8
import qualified Data.ByteString.Unsafe as C8.Unsafe
import qualified Data.Text.Encoding as TE
import qualified Data.Text.Encoding.Error as TE
import Data.Text.Prettyprint.Doc
import Foreign.C.String

newtype SymbolName = SymbolName { unSymbolName :: C8.ByteString }
  deriving (Eq, Ord, Show)

instance Pretty SymbolName where
  pretty = pretty . TE.decodeUtf8With TE.lenientDecode . C8.init . unSymbolName

{-# INLINE mkSymbolName #-}
mkSymbolName :: C8.ByteString -> SymbolName
mkSymbolName = SymbolName . (`C8.snoc` '\0')

{-# INLINE mkSymbolNameShortByteString #-}
mkSymbolNameShortByteString :: BSS.ShortByteString -> SymbolName
mkSymbolNameShortByteString = mkSymbolName . BSS.fromShort

{-# INLINE useSymbolNameAsCString #-}
useSymbolNameAsCString :: SymbolName -> (CString -> IO a) -> IO a
useSymbolNameAsCString = C8.Unsafe.unsafeUseAsCString . unSymbolName