Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. {-# LANGUAGE NoImplicitPrelude #-}
  2. {-# LANGUAGE OverloadedStrings #-}
  3. {-# LANGUAGE TupleSections #-}
  4.  
  5. module Main where
  6.  
  7. import System.IO (getLine)
  8. import ClassyPrelude
  9. import Control.Monad.Reader
  10. import Control.Monad.Trans.Maybe
  11.  
  12. main :: IO ()
  13. main = do
  14. print $ runReader (egReader "reader") (Config "aa" 1)
  15.  
  16. r <- runReaderT (egReaderT "readerT") (Config "bb" 1)
  17. print r
  18.  
  19. x <- runReaderT (runMaybeT maybeAndReader) (Config "bb" 1)
  20. print x
  21.  
  22. creds <- runMaybeT $ do
  23. u <- readUserName
  24. e <- readEmail
  25. p <- readPassword
  26. x <- MaybeT notInT
  27. print x
  28. pure (u, e, p)
  29. print creds
  30.  
  31. -------------------------------------------------------
  32. notInT :: IO (Maybe String)
  33. notInT = pure $ Just "123"
  34.  
  35. maybeAndReader :: MaybeT (ReaderT Config IO) String
  36. maybeAndReader = MaybeT $ do
  37. cfg <- ask
  38. liftIO $ print (cfgName cfg)
  39. str <- liftIO getLine
  40. guard $ length str > 5
  41. pure $ Just str
  42.  
  43. readUserName3 :: MaybeT IO String
  44. readUserName3 = do
  45. str <- lift getLine
  46. if length str < 5
  47. then pure str
  48. else pure mzero --empty
  49.  
  50. readUserName2 :: MaybeT IO String
  51. readUserName2 = do
  52. str <- lift getLine
  53. guard $ length str > 5
  54. pure str
  55.  
  56. readUserName :: MaybeT IO String
  57. readUserName = MaybeT $ do
  58. str <- getLine
  59. if length str > 5
  60. then pure $ Just str
  61. else pure Nothing
  62.  
  63. readEmail :: MaybeT IO String
  64. readEmail = MaybeT $ do
  65. pure $ Just "email"
  66.  
  67. readPassword :: MaybeT IO String
  68. readPassword = MaybeT $ do
  69. pure $ Just "pwd"
  70.  
  71. login :: String -> String -> String -> IO ()
  72. login u e p = do
  73. putStrLn "ok"
  74.  
  75. -------------------------------------------------------
  76. data Config = Config { cfgName :: String
  77. , cfgValue :: Int
  78. } deriving (Show)
  79.  
  80. egReader :: String -> Reader Config Int
  81. egReader s =
  82. --Notice not passing the config on
  83. egReaderCalled (s <> "!")
  84.  
  85. egReaderCalled :: String -> Reader Config Int
  86. egReaderCalled s = do
  87. v <- ask
  88. pure $ cfgValue v
  89.  
  90. egReaderT :: String -> ReaderT Config IO Int
  91. egReaderT s =
  92. egReaderTCalled (s <> "!")
  93.  
  94. egReaderTCalled :: String -> ReaderT Config IO Int
  95. egReaderTCalled s = do
  96. print s
  97. v <- ask
  98. pure $ cfgValue v
  99. -------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement