tremulous-query-1.0.6: Network/Tremulous/NameInsensitive.hs
module Network.Tremulous.NameInsensitive (
TI(..), mk, mkColor, mkAlphaNum
) where
import Prelude hiding (length, map, filter)
import Data.ByteString.Char8
import Data.Char
import Data.Ord
import Network.Tremulous.ByteStringUtils
data TI = TI
{ original :: !ByteString
, cleanedCase :: !ByteString
}
instance Eq TI where
a == b = cleanedCase a == cleanedCase b
instance Ord TI where
compare = comparing cleanedCase
instance Show TI where
show = show . original
mk :: ByteString -> TI
mk xs = TI bs (map toLower bs)
where bs = clean xs
mkColor :: ByteString -> TI
mkColor xs = TI bs (removeColors bs)
where bs = clean xs
mkAlphaNum :: ByteString -> TI
mkAlphaNum xs = TI bs (map toLower $ filter (\x -> isAlphaNum x || isSpace x) bs)
where bs = clean xs
clean :: ByteString -> ByteString
clean = stripw . filter (\c -> c >= '\x20' && c <= '\x7E')
removeColors :: ByteString -> ByteString
removeColors bss = rebuildC (length bss) f bss where
f '^' xs | Just (x2, xs2) <- uncons xs
, isAlphaNum x2
, Just (x3, xs3) <- uncons xs2
= f x3 xs3
f x xs = (toLower x, xs)