{-# 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 { internedTextId :: {-# UNPACK #-} !Id , uninternedText :: {-# UNPACK #-} !Text } instance IsString InternedText where fromString = intern . pack instance Eq InternedText where InternedText i _ == InternedText j _ = i == j instance Ord InternedText where compare (InternedText i _) (InternedText j _) = compare i j instance Show InternedText where showsPrec d (InternedText _ b) = showsPrec d b instance Interned InternedText where type Uninterned InternedText = Text newtype Description InternedText = DT Text deriving (Eq) describe = DT identify = InternedText cache = itCache instance Uninternable InternedText where unintern (InternedText _ b) = b instance Hashable (Description InternedText) where hashWithSalt s (DT h) = hashWithSalt s h itCache :: Cache InternedText itCache = mkCache {-# NOINLINE itCache #-}