module NLP.Alphabet.MultiChar where
import Control.DeepSeq (NFData(..))
import Data.Function (on)
import Data.Hashable
import Data.Interned
import Data.Interned.Internal (getCache)
import Data.Stringable
import Data.String (IsString)
import qualified Data.ByteString.Short as BS
import qualified Data.ByteString.Short.Internal as BS
import qualified Data.String as S
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import GHC.Generics
import qualified Data.HashMap.Strict as HM
import qualified Data.Array as A
import Data.Typeable (Typeable)
import Data.Data (Data)
internMultiChar :: MultiChar -> MultiChar
internMultiChar = uninternMultiChar . intern
newtype MultiChar = MultiChar { getMultiChar :: T.Text }
deriving (Eq,Ord,Generic,Data,Typeable)
instance Show MultiChar where
showsPrec p (MultiChar mc) r = showsPrec p (toString mc) r
instance Read MultiChar where
readsPrec p str = [ (MultiChar x, y) | (x,y) <- readsPrec p str ]
instance Hashable MultiChar
instance IsString MultiChar where
fromString = MultiChar . S.fromString
instance Stringable MultiChar where
toString = T.unpack . getMultiChar
fromString = MultiChar . T.pack
length = T.length . getMultiChar
fromText = MultiChar
toText = getMultiChar
instance NFData MultiChar where
rnf = rnf . getMultiChar
data InternedMultiChar = InternedMultiChar
{ internedMultiCharId :: !Id
, uninternMultiChar :: !MultiChar
}
deriving (Generic,Data,Typeable)
instance IsString InternedMultiChar where
fromString = intern . S.fromString
instance Eq InternedMultiChar where
(==) = (==) `on` internedMultiCharId
instance Ord InternedMultiChar where
compare = compare `on` uninternMultiChar
instance Read InternedMultiChar where
readsPrec p str = [ (intern x, y) | (x,y) <- readsPrec p str ]
instance Show InternedMultiChar where
showsPrec d (InternedMultiChar _ mc) = showsPrec d mc
instance Hashable InternedMultiChar where
hashWithSalt salt = hashWithSalt salt . internedMultiCharId
hash = hash . internedMultiCharId
instance Interned InternedMultiChar where
type Uninterned InternedMultiChar = MultiChar
newtype Description InternedMultiChar = DMC MultiChar deriving (Eq,Hashable)
describe = DMC . MultiChar . T.copy . getMultiChar
identify = InternedMultiChar
cache = imcCache
imcCache :: Cache InternedMultiChar
imcCache = mkCache
instance Stringable InternedMultiChar where
toString = toString . uninternMultiChar
fromString = intern . fromString
length = Data.Stringable.length . uninternMultiChar
toText = toText . uninternMultiChar
fromText = intern . fromText
instance NFData InternedMultiChar where
rnf (InternedMultiChar i c) = rnf i `seq` rnf c