Skip to content

Instantly share code, notes, and snippets.

@nattybear
Created April 7, 2023 17:14
Show Gist options
  • Save nattybear/05c867147ec70ec94b19ddd40137e3e3 to your computer and use it in GitHub Desktop.
Save nattybear/05c867147ec70ec94b19ddd40137e3e3 to your computer and use it in GitHub Desktop.
module Robot where
import Control.Concurrent.MVar
import Control.Monad.State
import System.Random.Stateful
type Robot = MVar String
type RunState = [String]
initialState :: RunState
initialState = []
mkRobot :: StateT RunState IO Robot
mkRobot = do
n <- mkName
lift (newMVar n)
robotName :: Robot -> IO String
robotName r = do
n <- takeMVar r
putMVar r n
return n
resetName :: Robot -> StateT RunState IO ()
resetName r = do
n <- lift (takeMVar r)
n' <- lift mkName'
lift (putMVar r n')
xs <- get
put (filter (/=n) (n':xs))
mkName :: StateT RunState IO String
mkName = do
n <- lift mkName'
xs <- get
if n `elem` xs
then mkName
else do
put (n:xs)
return n
mkName' :: IO String
mkName' = do
a <- letter
b <- letter
c <- digit
d <- digit
e <- digit
return [a,b,c,d,e]
where
letter = randomRIO ('A','Z')
digit = randomRIO ('0','9')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment