Skip to content

Instantly share code, notes, and snippets.

@gazay
Created January 7, 2015 14:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gazay/3938fdba455c6bf1bea0 to your computer and use it in GitHub Desktop.
Save gazay/3938fdba455c6bf1bea0 to your computer and use it in GitHub Desktop.
State monad
import System.Random (newStdGen, randomR)
import Gimlh
import Data.List.Split (splitOn)
import Data.List (intercalate)
import Control.Monad.State
main = putStrLn $ runFaker $ do
n <- name
return $ unwords ["Hello", "my", "name", "is", n]
type FakerData = SimpleGiml
newtype Faker a = State FakerData a
loadFakerData :: IO FakerData
loadFakerData = parseFile "../data/en.giml" >>= simplifyGiml
name :: Faker String
name = do
\(giml, gen)
runFaker :: Faker a -> IO a
runFaker faker = do
myData <- loadFakerData
stdGen <- newStdGen
return $ runState (FakerData, stdGen) faker
valsList :: FakerData -> String -> [String]
valsList giml, key = let fetchedVal = fetch giml key
in
case fetchedVal of
Nothing -> []
(Just val) -> val2List val
randomValue :: (FakerData, StdGen) -> String -> (String, StdGen)
randomValue (giml, gen) key = let vals = valsList giml, key
(ind, newGen) = randomR (0, length vals - 1) gen
in (vals !! ind, newGen)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment