import system.io

open char
open list
open io


def rand_range(lo : nat)(hi: nat) : io nat := do
  r <- io.cmd { cmd := "head", args := ["-c 80", "/dev/urandom"] },
  let seed := foldl (+) 0 $ map to_nat r.to_list,
  let gen := mk_std_gen seed,
  let (target, _) := rand_nat gen lo hi,
  return target

def get_guess : io nat := do
  put_str "Guess a number between 1 and 100 (inclusive)\n",
  put_str "Your guess: ",
  response <- get_line,
  return $ string.to_nat response

def main : io unit := do
  target <- rand_range 1 100,
  iterate 20 $ λ i,
  if i > 0 then do {
    put_str $ "You have " ++ (to_string i) ++ " guesses left\n",
    guess <- get_guess,
    match cmp guess target with
    | ordering.eq := do { put_str "\nYou win!\n", return none }
    | ordering.gt := do { put_str "\ntoo high\n", return $ some (i - 1) }
    | ordering.lt := do { put_str "\ntoo low\n", return $ some (i - 1) }
    end
  } else
    return none,
  return ()
