Line ∷ (Monad p, P.TokenParsing p) ⇒ p (String, String, String, Maybe String)
readAuthInfoLine = do
  P.whiteSpace
  machine  ←              gettok False "machine"  $ P.some $ P.alphaNum <|> P.oneOf "-."
  login    ←              gettok False "login"    $ P.some P.alphaNum
  mport    ← P.optional $ gettok False "port"     $ P.some P.alphaNum
  password ←              gettok True  "password" $ P.some $ P.noneOf " \t\n\r"
  pure (machine, login, password, mport)

readAuthInfo ∷ (Monad 
readAuthInfoLine ∷ (Monad p, P.TokenParsing p) ⇒ p (String, String, String, Maybe String)
readAuthInfoLine = do
  P.whiteSpace
  machine  ←              gettok False "machine"  $ P.some $ P.alphaNum <|> P.oneOf "-."
  login    ←              gettok False "login"    $ P.some P.alphaNum
  mport    ← P.optional $ gettok False "port"     $ P.some P.alphaNum
  password ←              gettok True  "password" $ P.some $ P.noneOf " \t\n\r"
  pure (machine, login, password, mport)
readAuthInfoLine = do
  P.whiteSpace
  machine  ←              gettok False "machine"  $ P.some $ P.alphaNum <|> P.oneOf "-."
  login    ←              gettok False "login"    $ P.some P.alphaNum
  mport    ← P.optional $ gettok False "port"     $ P.some P.alphaNum
  password ←              gettok True  "password" $ P.some $ P.noneOf " \t\n\r"
  pure (machine, login, password, mport)