module Network.Tremulous.NameInsensitive (
TI(..), mk, mkColor, mkAlphaNum, mkColorAlpha, unpackorig
) where
import Control.DeepSeq
import Data.ByteString.Char8 as B
import Data.Char
import Data.Ord
data TI = TI {
original :: !ByteString
, cleanedCase :: !ByteString
}
instance NFData TI
instance Eq TI where
a == b = cleanedCase a == cleanedCase b
instance Ord TI where
compare = comparing cleanedCase
instance Show TI where
show = show . original
unpackorig :: TI -> String
unpackorig = B.unpack . original
mk :: ByteString -> TI
mk bs = TI bs (B.map toLower bs)
mkColor :: ByteString -> TI
mkColor bs = TI bs (B.map toLower $ removeColors bs)
mkAlphaNum :: ByteString -> TI
mkAlphaNum bs = TI bs (B.map toLower $ B.filter isAlphaNum bs)
mkColorAlpha :: ByteString -> TI
mkColorAlpha bs = TI bs (B.map toLower $ B.filter isPrint $ removeColors bs)
removeColors :: ByteString -> ByteString
removeColors = B.pack . rc . B.unpack
rc :: String -> String
rc ('^' : x : xs) | isAlphaNum x = rc xs
rc (x : xs) = x : rc xs
rc [] = []