Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad.Trans.Maybe
- import Control.Monad.IO.Class
- import Data.Char (isNumber, isPunctuation)
- import Control.Monad.Error
- askPassword :: MaybeT IO ()
- askPassword = do
- liftIO $ putStrLn "Enter your new password:"
- value <- msum $ repeat getValidPassword
- liftIO $ putStrLn "Storing in database..."
- getValidPassword :: MaybeT IO String
- getValidPassword = do
- s <- liftIO getLine
- guard (isValid s)
- return s
- isValid :: String -> Bool
- isValid s = length s >= 8
- && any isNumber s
- && any isPunctuation s
- data PwdError = PwdError String
- type PwdErrorMonad = ErrorT PwdError IO
- instance Error PwdError where
- noMsg = PwdError ""
- strMsg msg = PwdError msg
- askPassword' :: PwdErrorMonad ()
- askPassword' = do
- liftIO $ putStrLn "Enter your new password:"
- value <- msum $ repeat $ getValidPassword'
- liftIO $ putStrLn "Storing in database..."
- handleErr (PwdError err) = do
- liftIO $ putStrLn err
- throwError $ PwdError err
- getValidPassword' :: PwdErrorMonad String
- getValidPassword' = action `catchError` handleErr
- where
- action = do
- s <- liftIO getLine
- if length s < 8 then
- throwError $ PwdError "Incorrect input: password is too short!"
- else
- if not (any isNumber s) then
- throwError $ PwdError "Incorrect input: password must contain some digits!"
- else
- if not (any isPunctuation s) then
- throwError $ PwdError "Incorrect input: password must contain some punctuations!"
- else
- return s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement