module NLP.Alphabet.MultiChar where
import Data.Function (on)
import Data.Hashable
import Data.Interned
import Data.String
import qualified Data.ByteString.Short as S
import qualified Data.ByteString.Short.Internal as S
internMultiChar :: MultiChar -> MultiChar
internMultiChar = uninternMultiChar . intern
newtype MultiChar = MultiChar { unMultiChar :: S.ShortByteString }
deriving (Eq,Ord)
instance Show MultiChar where
showsPrec p (MultiChar ps) r = showsPrec p ps r
instance Read MultiChar where
readsPrec p str = [ (MultiChar x, y) | (x,y) <- readsPrec p str ]
instance Hashable MultiChar where
hashWithSalt salt (MultiChar s@(S.SBS sbs)) = hashByteArrayWithSalt sbs 0 (S.length s) salt
instance IsString MultiChar where
fromString = MultiChar . fromString
data InternedMultiChar = InternedMultiChar
{ internedMultiCharId :: !Id
, uninternMultiChar :: !MultiChar
}
instance IsString InternedMultiChar where
fromString = intern . fromString
instance Eq InternedMultiChar where
(==) = (==) `on` internedMultiCharId
instance Ord InternedMultiChar where
compare = compare `on` internedMultiCharId
instance Show InternedMultiChar where
showsPrec d (InternedMultiChar _ mc) = showsPrec d mc
instance Interned InternedMultiChar where
type Uninterned InternedMultiChar = MultiChar
newtype Description InternedMultiChar = DMC MultiChar deriving (Eq,Hashable)
describe = DMC
identify = InternedMultiChar
cache = imcCache
imcCache :: Cache InternedMultiChar
imcCache = mkCache