Advertisement
Guest User

Untitled

a guest
Nov 28th, 2015
338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import Control.Monad.Trans.Maybe
  2. import Control.Monad.IO.Class
  3. import Data.Char (isNumber, isPunctuation)
  4. import Control.Monad.Error
  5.  
  6. askPassword :: MaybeT IO ()
  7. askPassword = do
  8.   liftIO $ putStrLn "Enter your new password:"
  9.   value <- msum $ repeat getValidPassword
  10.   liftIO $ putStrLn "Storing in database..."
  11.  
  12. getValidPassword :: MaybeT IO String
  13. getValidPassword = do
  14.   s <- liftIO getLine
  15.   guard (isValid s)
  16.   return s
  17.  
  18. isValid :: String -> Bool
  19. isValid s = length s >= 8
  20.             && any isNumber s
  21.             && any isPunctuation s
  22.  
  23.  
  24. data PwdError = PwdError String
  25.  
  26. type PwdErrorMonad = ErrorT PwdError IO
  27.  
  28. instance Error PwdError where
  29.     noMsg      = PwdError ""
  30.     strMsg msg = PwdError msg
  31.              
  32. askPassword' :: PwdErrorMonad ()
  33. askPassword' = do
  34.     liftIO $ putStrLn "Enter your new password:"
  35.     value <- msum $ repeat $ getValidPassword'
  36.    liftIO $ putStrLn "Storing in database..."
  37. handleErr (PwdError err) = do
  38.    liftIO $ putStrLn err
  39.    throwError $ PwdError err    
  40.  
  41. getValidPassword' :: PwdErrorMonad String
  42. getValidPassword' = action `catchError` handleErr
  43.  where
  44.    action = do
  45.        s <- liftIO getLine
  46.        if length s < 8 then
  47.            throwError $ PwdError "Incorrect input: password is too short!"
  48.        else
  49.            if not (any isNumber s) then
  50.                throwError $ PwdError "Incorrect input: password must contain some digits!"
  51.            else        
  52.                if not (any isPunctuation s) then
  53.                    throwError $ PwdError "Incorrect input: password must contain some punctuations!"
  54.                else
  55.                    return s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement