{-# LANGUAGE TypeFamilies, FlexibleInstances #-}
module Data.Interned.Internal.Text
  ( InternedText(..)
  ) where

import Data.String
import Data.Interned
import Data.Text
import Data.Hashable

data InternedText = InternedText
  { InternedText -> Id
internedTextId :: {-# UNPACK #-} !Id
  , InternedText -> Text
uninternedText :: {-# UNPACK #-} !Text
  }

instance IsString InternedText where
  fromString :: String -> InternedText
fromString = Text -> InternedText
forall t. Interned t => Uninterned t -> t
intern (Text -> InternedText)
-> (String -> Text) -> String -> InternedText
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack

instance Eq InternedText where
  InternedText Id
i Text
_ == :: InternedText -> InternedText -> Bool
== InternedText Id
j Text
_ = Id
i Id -> Id -> Bool
forall a. Eq a => a -> a -> Bool
== Id
j

instance Ord InternedText where
  compare :: InternedText -> InternedText -> Ordering
compare (InternedText Id
i Text
_) (InternedText Id
j Text
_) = Id -> Id -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Id
i Id
j

instance Show InternedText where
  showsPrec :: Id -> InternedText -> ShowS
showsPrec Id
d (InternedText Id
_ Text
b) = Id -> Text -> ShowS
forall a. Show a => Id -> a -> ShowS
showsPrec Id
d Text
b

instance Hashable InternedText where
  hashWithSalt :: Id -> InternedText -> Id
hashWithSalt Id
s (InternedText Id
i Text
_) = Id -> Id -> Id
forall a. Hashable a => Id -> a -> Id
hashWithSalt Id
s Id
i

instance Interned InternedText where
  type Uninterned InternedText = Text
  newtype Description InternedText = DT Text deriving (Description InternedText -> Description InternedText -> Bool
(Description InternedText -> Description InternedText -> Bool)
-> (Description InternedText -> Description InternedText -> Bool)
-> Eq (Description InternedText)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Description InternedText -> Description InternedText -> Bool
$c/= :: Description InternedText -> Description InternedText -> Bool
== :: Description InternedText -> Description InternedText -> Bool
$c== :: Description InternedText -> Description InternedText -> Bool
Eq)
  describe :: Uninterned InternedText -> Description InternedText
describe = Text -> Description InternedText
Uninterned InternedText -> Description InternedText
DT
  identify :: Id -> Uninterned InternedText -> InternedText
identify = Id -> Text -> InternedText
Id -> Uninterned InternedText -> InternedText
InternedText
  cache :: Cache InternedText
cache = Cache InternedText
itCache

instance Uninternable InternedText where
  unintern :: InternedText -> Uninterned InternedText
unintern (InternedText Id
_ Text
b) = Text
Uninterned InternedText
b

instance Hashable (Description InternedText) where
  hashWithSalt :: Id -> Description InternedText -> Id
hashWithSalt Id
s (DT h) = Id -> Text -> Id
forall a. Hashable a => Id -> a -> Id
hashWithSalt Id
s Text
h

itCache :: Cache InternedText
itCache :: Cache InternedText
itCache = Cache InternedText
forall t. Interned t => Cache t
mkCache
{-# NOINLINE itCache #-}