module Network.AdHoc.Channel (
ChannelName,
mkChannelName,
anonymous,
validateChannelName,
ChannelID(..)
) where
import Data.Char
import Data.Ord
import qualified Data.Set as Set
newtype ChannelName = ChannelName String
mkChannelName :: String -> ChannelName
mkChannelName = ChannelName
getOrd :: ChannelName -> String
getOrd (ChannelName n) = map toLower n
anonymous :: ChannelName
anonymous = mkChannelName "Anonymous"
validateChannelName :: ChannelName -> Maybe String
validateChannelName cname
| len < 1 = Just "Sorry, the channel name may not be empty."
| len > 16 = Just "Sorry, the channel name is limited to 16 characters."
| and (map ((flip Set.member) allowed) str) = Nothing
| otherwise = Just $ "Sorry, only the following characters are suported in channel names:\n\n"
++ "\tLetters\tA - Z and a - z\n"
++ "\tDigits\t0 - 9\n"
++ "\tUnderscore '_', hyphen '-' and dot '.'"
where
allowed = Set.fromList $ ['a'..'z'] ++ ['0'..'9'] ++ ['_', '.', '-']
str = getOrd cname
len = length str
instance Show ChannelName where
show (ChannelName n) = n
instance Eq ChannelName where
c1 == c2 = EQ == compare c1 c2
instance Ord ChannelName where
compare = comparing getOrd
data ChannelID = ChannelID
{ channelValue :: String
, channelHost :: String
} deriving (Eq, Ord)
instance Show ChannelID where
show cid = channelValue cid ++ "@" ++ channelHost cid