-generic gIRCParse a :: [String] -> (Either [Error] a, [String])
-gIRCParse{|UNIT|} a = (Right UNIT, a)
-gIRCParse{|String|} as = pOne as
-gIRCParse{|Int|} as = appFst (fmap toInt) $ pOne as
-gIRCParse{|EITHER|} lp rp as = case lp as of
- (Right a, rest) = (Right $ LEFT a, rest)
- (Left e1, _) = case rp as of
- (Right a, rest) = (Right $ RIGHT a, rest)
- (Left e2, _) = (Left $ e1 ++ e2, [])
-gIRCParse{|OBJECT|} p as = appFst (fmap OBJECT) $ p as
-gIRCParse{|CONS of d|} p [] = (Left ["Expected a cmd constructor: " +++ d.gcd_name], [])
-gIRCParse{|CONS of d|} p [a:as]
-| a <> d.gcd_name = (Left ["Wrong constructor. expected: " +++ d.gcd_name +++ ", got: " +++ a], [])
-= case p as of
- (Right a, rest) = (Right $ CONS a, rest)
- (Left e, _) = (Left e, [])
-gIRCParse{|PAIR|} pl pr as = case pl as of
- (Right a1, rest) = case pr rest of
- (Right a2, rest) = (Right $ PAIR a1 a2, rest)
- (Left e, _) = (Left e, [])
- (Left e, _) = (Left e, [])
-gIRCParse{|[]|} pl as = case pl as of
- (Right e, rest) = case gIRCParse{|*->*|} pl rest of
- (Right es, rest) = (Right [e:es], rest)
- (Left e, _) = (Left e, [])
- (Left e, _) = (Right [], as)
-gIRCParse{|Maybe|} pm as
- = appFst (either (const $ Right Nothing) $ Right o Just) $ pm as
+ parseUser :: Parser Char IRCUser
+ parseUser = parseNick
+ >>= \nick->optional (pToken '!' >>| parseUsr)
+ >>= \muser->optional (pToken '@' >>| parseHost)
+ >>= \mhost->pure {IRCUser
+ | irc_nick=nick, irc_user=muser, irc_host=mhost}
+
+ parseUsr :: Parser Char String
+ parseUsr = toString <$> pSome (pNoneOf [' ', '@':illegal])
+
+ parseNick :: Parser Char String
+ parseNick = pAlpha
+ >>= \c ->pMany (pAlpha <|> pDigit <|> pOneOf (fromString "-[]\\`^{}"))
+ >>= \cs->pure (toString [c:cs])