Jump to content

User:Duplode/Contrived ST example

From Wikibooks, open books for an open world
import Control.Monad.ST
import Data.STRef
import Control.Monad
import System.Random
import qualified Data.HashTable.ST.Basic as H

type HashTable k v = H.HashTable k v
type RandomSeed = Int

scatter :: RandomSeed -> (Int, Integer)
scatter seed = runST $ do
    gen <- newSTRef $ mkStdGen seed
    hsh <- H.new
    replicateM_ (1000 * 1000) $ do
        gen1 <- readSTRef gen
        let (k, gen2) = randomR (0, 1000 * 1000) gen1
            (v, gen3) = randomR (0, 1000 * 1000) gen2
        H.insert hsh (k :: Int) (v :: Integer)
        writeSTRef gen gen3
    let lookCountAdd p@(c, s) n = do
            mx <- H.lookup hsh n
            return $ case mx of
                Nothing -> p
                Just x  -> (c + 1, s + x)
    foldM lookCountAdd (0, 0) [1..100 * 1000]