module Data.ByteString.Interned
( module Data.ByteString.Interned
) where
import Control.Applicative
import Control.DeepSeq (NFData(..))
import Data.Aeson as A
import Data.Binary as DB
import Data.ByteString (ByteString)
import Data.Hashable
import Data.Serialize as DS
import Data.Serialize.Text
import Data.String as IS
import Data.String.Conversions
import Data.Text.Binary
import Data.Text.Encoding (decodeUtf8,encodeUtf8)
import Data.Text (Text)
import Data.Vector.Unboxed.Deriving
import GHC.Generics
import Data.ByteString.Interned.Internal
newtype IBS k = IBS { getIBS :: Int }
deriving (Eq,Generic)
derivingUnbox "IBS"
[t| forall k . IBS k → Int |]
[| getIBS |]
[| IBS |]
instance Ord (IBS k) where
IBS l `compare` IBS r = ibsBimapLookupInt l `compare` ibsBimapLookupInt r
{-# Inline compare #-}
ibs ∷ ByteString → IBS k
ibs s = IBS $! ibsBimapAdd s
{-# Inline ibs #-}
ibsText ∷ Text → IBS k
ibsText s = IBS $! ibsBimapAdd $ encodeUtf8 s
{-# Inline ibsText #-}
instance IsString (IBS k) where
fromString = ibsText . IS.fromString
{-# Inline fromString #-}
instance Show (IBS k) where
showsPrec p i r = showsPrec p (ibsTo i :: String) r
{-# Inline showsPrec #-}
instance Read (IBS k) where
readsPrec p str = [ (ibsText $ IS.fromString s, y) | (s,y) <- readsPrec p str ]
{-# Inline readsPrec #-}
instance Hashable (IBS k)
ibsFrom ∷ ConvertibleStrings x Text ⇒ x → IBS k
ibsFrom = ibsText . convertString
{-# Inline ibsFrom #-}
ibsTo ∷ ConvertibleStrings Text x ⇒ IBS k → x
ibsTo = convertString . ibsToText
{-# Inline ibsTo #-}
ibsToText ∷ IBS k → Text
ibsToText = decodeUtf8 . ibsToUtf8
{-# Inline ibsToText #-}
ibsToUtf8 ∷ IBS k → ByteString
ibsToUtf8 = ibsBimapLookupInt . getIBS
{-# Inline ibsToUtf8 #-}
instance NFData (IBS k) where
rnf = rnf . getIBS
{-# Inline rnf #-}
instance Binary (IBS k) where
put = DB.put . ibsToText
get = ibs <$> DB.get
{-# Inline put #-}
{-# Inline get #-}
instance Serialize (IBS k) where
put = DS.put . ibsToText
get = ibs <$> DS.get
{-# Inline put #-}
{-# Inline get #-}
instance FromJSON (IBS k) where
parseJSON s = ibsText <$> parseJSON s
{-# Inline parseJSON #-}
instance ToJSON (IBS k) where
toJSON = toJSON . ibsToText
{-# Inline toJSON #-}