module HGraph.Utils where

import System.Random
import Control.Monad
import Control.Monad.State

mhead :: [a] -> Maybe a
mhead []    = Maybe a
forall a. Maybe a
Nothing
mhead (a
x:[a]
_) = a -> Maybe a
forall a. a -> Maybe a
Just a
x

randomN :: (Random a, RandomGen g) => a -> a -> State g a
randomN :: forall a g. (Random a, RandomGen g) => a -> a -> State g a
randomN a
n0 a
n1 = do
  g
gen <- StateT g Identity g
forall s (m :: * -> *). MonadState s m => m s
get
  let (a
r,g
gen') = (a, a) -> g -> (a, g)
forall g. RandomGen g => (a, a) -> g -> (a, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR (a
n0,a
n1) g
gen
  g -> StateT g Identity ()
forall s (m :: * -> *). MonadState s m => s -> m ()
put g
gen'
  a -> State g a
forall a. a -> StateT g Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return a
r

-- | Lists all subsets of `s` of size exactly `k`.
choose :: t -> [a] -> [[a]]
choose t
0 [a]
_  = [[]]
choose t
_ [] = []
choose t
k (a
x:[a]
xs) = ([a] -> [a]) -> [[a]] -> [[a]]
forall a b. (a -> b) -> [a] -> [b]
map (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:) (t -> [a] -> [[a]]
choose (t
k t -> t -> t
forall a. Num a => a -> a -> a
- t
1) [a]
xs) [[a]] -> [[a]] -> [[a]]
forall a. [a] -> [a] -> [a]
++ t -> [a] -> [[a]]
choose t
k [a]
xs

guessOne :: (t -> t -> Maybe a) -> (t -> t -> t) -> t -> [t] -> Maybe a
guessOne t -> t -> Maybe a
_ t -> t -> t
_ t
_ [] = Maybe a
forall a. Maybe a
Nothing
guessOne t -> t -> Maybe a
taken t -> t -> t
notTaken t
guess (t
x:[t]
xs) = 
  (t -> t -> Maybe a
taken t
x t
guess)
  Maybe a -> Maybe a -> Maybe a
forall a. Maybe a -> Maybe a -> Maybe a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus`
  ((t -> t -> Maybe a) -> (t -> t -> t) -> t -> [t] -> Maybe a
guessOne t -> t -> Maybe a
taken t -> t -> t
notTaken (t -> t -> t
notTaken t
x t
guess) [t]
xs)