Guest User

Untitled

a guest
Oct 18th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.43 KB | None | 0 0
  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE FlexibleContexts #-}
  3. {-# LANGUAGE GADTs #-}
  4. {-# LANGUAGE LambdaCase #-}
  5. {-# LANGUAGE OverloadedStrings #-}
  6. {-# LANGUAGE RankNTypes #-}
  7. {-# LANGUAGE TypeOperators #-}
  8.  
  9. module App where
  10.  
  11. --------------------------------------------------------------------------------
  12. import Control.Monad.Freer
  13. import Control.Monad.Freer.State
  14. import Data.Map (Map)
  15. import qualified Data.Map as Map
  16. import Data.Text (Text)
  17. --------------------------------------------------------------------------------
  18.  
  19. data Counter r where
  20. Val :: Counter Int
  21. Inc :: Int -> Counter ()
  22. Dec :: Int -> Counter ()
  23.  
  24. val :: Member Counter effs => Eff effs Int
  25. val = send Val
  26.  
  27. inc :: Member Counter effs => Int -> Eff effs ()
  28. inc = send . Inc
  29.  
  30. dec :: Member Counter effs => Int -> Eff effs ()
  31. dec = send . Dec
  32.  
  33. runCounterInMemory :: Int -> Eff (Counter ': effs) ~> Eff effs
  34. runCounterInMemory i = evalState i . go
  35. where
  36. go :: Eff (Counter ': effs) ~> Eff (State Int ': effs)
  37. go = reinterpret $ \case
  38. Val -> get
  39. Inc v -> modify (\a -> a + v)
  40. Dec v -> modify (\a -> a - v)
  41.  
  42. data User = User Text Text deriving Show
  43.  
  44. data Mapper r where
  45. UserAll :: Mapper [User]
  46. UserGet :: Text -> Mapper (Maybe User)
  47. UserAdd :: Text -> User -> Mapper ()
  48. UserDel :: Text -> Mapper ()
  49.  
  50. userAll :: Member Mapper effs => Eff effs [User]
  51. userAll = send UserAll
  52.  
  53. userGet :: Member Mapper effs => Text -> Eff effs (Maybe User)
  54. userGet = send . UserGet
  55.  
  56. userAdd :: Member Mapper effs => Text -> User -> Eff effs ()
  57. userAdd k v = send $ UserAdd k v
  58.  
  59. userDel :: Member Mapper effs => Text -> Eff effs ()
  60. userDel = send . UserDel
  61.  
  62. type Vdb = Map Text User
  63.  
  64. runMapperInMemory :: Vdb -> Eff (Mapper ': effs) ~> Eff effs
  65. runMapperInMemory vdb = evalState vdb . go
  66. where
  67. go :: Eff (Mapper ': effs) ~> Eff (State Vdb ': effs)
  68. go = reinterpret $ \case
  69. UserAll -> get >>= \db -> return . Map.elems $ (db :: Vdb)
  70. UserGet k -> get >>= return . Map.lookup k
  71. UserAdd k v -> modify (\db -> Map.insert k v db :: Vdb)
  72. UserDel k -> modify (\db -> Map.delete k db :: Vdb)
  73.  
  74. counterApp :: Members '[Counter] effs => Eff effs Int
  75. counterApp = do
  76. inc 10
  77. dec 3
  78. inc 5
  79. dec 15
  80. dec 1
  81. val
  82.  
  83. mapperApp :: Members '[IO, Mapper] effs => Eff effs [User]
  84. mapperApp = do
  85. userAdd "luke" (User "Luke" "Cage")
  86. userAdd "jess" (User "Jessica" "Jones")
  87. userAdd "matt" (User "Matt" "Murdock")
  88. luke <- userGet "luke"
  89. send $ print luke
  90. userDel "jess"
  91. jess <- userGet "jess"
  92. send $ print jess
  93. userAll
  94.  
  95. allApp :: Members '[IO, Mapper, Counter] effs => Eff effs (Int, [User])
  96. allApp = do
  97. userAdd "luke" (User "Luke" "Cage")
  98. userAdd "jess" (User "Jessica" "Jones")
  99. inc 10
  100. userAdd "matt" (User "Matt" "Murdock")
  101. luke <- userGet "luke"
  102. inc 20
  103. dec 5
  104. send $ print luke
  105. userDel "jess"
  106. jess <- userGet "jess"
  107. dec 13
  108. send $ print jess
  109. us <- userAll
  110. n <- val
  111. return (n, us)
  112.  
  113. exec :: IO ()
  114. exec = do
  115. -- counter
  116. putStrLn "--------------------"
  117. putStrLn "counter"
  118. putStrLn "--------------------"
  119. let v = run . runCounterInMemory 0 $ counterApp
  120. putStrLn $ show v
  121.  
  122. -- mapper
  123. putStrLn "--------------------"
  124. putStrLn "mapper"
  125. putStrLn "--------------------"
  126. m <- runM . runMapperInMemory Map.empty $ mapperApp
  127. putStrLn $ show m
  128.  
  129. -- combined
  130. putStrLn "--------------------"
  131. putStrLn "combined"
  132. putStrLn "--------------------"
  133. (n, us) <- runM . runMapperInMemory Map.empty . runCounterInMemory 0 $ allApp
  134. print n
  135. print us
Add Comment
Please, Sign In to add comment