+
+parseCmd :: [Char] -> Either Error IRCCommand
+parseCmd cs
+| not (trace_tn $ toString cs) = undef
+= processParse $ argfun $ 'Text'.split " " $ toString cs
+ where
+ argfun :: [String] -> [String]
+ argfun [] = []
+ argfun [x:xs]
+ # x = 'Text'.trim x
+ | x.[0] == ':' = ['Text'.join " " [x:xs]]
+ | otherwise = [x:argfun xs]
+
+ command0 :: IRCCommand [String] -> Either Error IRCCommand
+ command0 c [] = Right c
+ command0 c x = Left $ toString c +++ " doesn't have arguments"
+
+ processParse :: [String] -> Either Error IRCCommand
+ processParse [] = Left "Empty list of arguments"
+ processParse [cmd:args] = case cmd of
+ //"ADMIN" = (Maybe String)
+ //"AWAY" = String
+ //"CONNECT" = String (Maybe (Int, Maybe String))
+ "DIE" = command0 DIE args
+ //"ERROR" = String
+ //"INFO" = (Maybe String)
+ //"INVITE" = String String
+ //"ISON" = [String]
+ //"JOIN" = [(String, Maybe String)]
+ //"KICK" = String String (Maybe String)
+ //"KILL" = String String
+ //"LINKS" = (Maybe (Maybe String, String))
+ //"LIST" = (Maybe ([String], Maybe String))
+ //"LUSERS" = (Maybe (String, Maybe String))
+ //"MODE" = String String (Maybe String) (Maybe String) (Maybe String)
+ //"MOTD" = (Maybe String)
+ //"NAMES" = [String]
+ //"NICK" = String (Maybe String)
+ "NJOIN" = command0 NJOIN args
+ //"NOTICE" = String String
+ //"OPER" = String String
+ //"PART" = [String]
+ //"PASS" = String
+ //"PING" = String (Maybe String)
+ //"PONG" = String (Maybe String)
+ //"PRIVMSG" = [String] String
+ "QUIT" = case args of
+ [_,_:_] = Left $ "QUIT has too many arguments"
+ x = Right $ QUIT $ listToMaybe x
+ "REHASH" = command0 REHASH args
+ "RESTART" = command0 REHASH args
+ "SERVER" = command0 REHASH args
+ //"SERVICE" = String String String String
+ //"SERVLIST" = (Maybe (String, Maybe String))
+ //"SQUERY" = String String
+ "SQUIRT" = command0 REHASH args
+ //"SQUIT" = String String
+ //"STATS" = (Maybe (String, Maybe String))
+ //"SUMMON" = String (Maybe (String, Maybe String))
+ //"TIME" = (Maybe String)
+ //"TOPIC" = String (Maybe String)
+ //"TRACE" = (Maybe String)
+ //"USER" = String String String
+ //"USERHOST" = [String]
+ //"USERS" = (Maybe String)
+ //"VERSION" = (Maybe String)
+ //"WALLOPS" = String
+ //"WHO" = (Maybe String)
+ //"WHOIS" = (Maybe String) [String]
+ //"WHOWAS" = (Maybe String) [String]
+ _ = Left $ "Unknown command: " +++ cmd
+
+parsePrefix :: Parser Char (Maybe (Either String IRCUser))
+parsePrefix = optional (parseEither parseHost parseUser) <* spaceParser
+
+parseReply :: Parser Char IRCNumReply
+parseReply = (toString <$> pSome pDigit)
+ >>= \rep->pMiddle
+ >>= \recipient->spaceParser >>| (toString <$> pSome (pNoneOf illegal))
+ >>= \msg->pure {IRCNumReply|irc_reply=fs rep,irc_recipient=recipient,irc_message=msg}
+ where
+ fs :: String -> IRCReplies
+ fs s = fromInt $ toInt s