let indexSuchThat (pred:'a->bool) (l:'a list) : (int option) = 
  let rec indexOf pred l i = (match l with 
  | []                  -> None
  | y::r when (pred y)  -> Some i
  | y::r                -> indexOf pred r (i+1) ) 
  in indexOf pred l 0