https://github.com/simonmar/parconc-examples
Tip revision: a6c89f015584a2cc2f3b01356b0d6ed5cd0f0a67 authored by Simon Marlow on 08 November 2021, 09:52:23 UTC
Merge pull request #34 from ehigham/master
Merge pull request #34 from ehigham/master
Tip revision: a6c89f0
phonebook.hs
import Data.Map (Map)
import qualified Data.Map as Map
import Control.Concurrent
import Prelude hiding (lookup)
-- <<types
type Name = String
type PhoneNumber = String
type PhoneBook = Map Name PhoneNumber
newtype PhoneBookState = PhoneBookState (MVar PhoneBook)
-- >>
-- <<new
new :: IO PhoneBookState
new = do
m <- newMVar Map.empty
return (PhoneBookState m)
-- >>
-- <<insert
insert :: PhoneBookState -> Name -> PhoneNumber -> IO ()
insert (PhoneBookState m) name number = do
book <- takeMVar m
putMVar m (Map.insert name number book)
-- >>
-- <<lookup
lookup :: PhoneBookState -> Name -> IO (Maybe PhoneNumber)
lookup (PhoneBookState m) name = do
book <- takeMVar m
putMVar m book
return (Map.lookup name book)
-- >>
-- <<main
main = do
s <- new
sequence_ [ insert s ("name" ++ show n) (show n) | n <- [1..10000] ]
lookup s "name999" >>= print
lookup s "unknown" >>= print
-- >>