fastFindIndex cond xs prev now
  | prev==now    &&     matchNow  = Just now
  | prev==now    && not matchNow  = Nothing
  | not matchNow && not matchPrev = fastFindIndex cond xs now (now+(now-prev)*2)
  | not matchNow &&     matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow && not matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow &&     matchPrev = fastFindIndex cond xs now (now+(now-prev)`div`2) where
    matchNow  = cond(xs now)  == True
    matchPrev = cond(xs prev) == True
fastFindIndex cond xs prev now
  | prev==now    &&     matchNow  = Just now
  | prev==now    && not matchNow  = Nothing
  | not matchNow && not matchPrev = fastFindIndex cond xs now (now+(now-prev)*2)
  | not matchNow &&     matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow && not matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow &&     matchPrev = fastFindIndex cond xs now (now+(now-prev)`div`2) where
    matchNow  = cond(xs now)  == True
    matchPrev = cond(xs prev) == True
fastFindIndex cond xs prev now
  | prev==now    &&     matchNow  = Just now
  | prev==now    && not matchNow  = Nothing
  | not matchNow && not matchPrev = fastFindIndex cond xs now (now+(now-prev)*2)
  | not matchNow &&     matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow && not matchPrev = fastFindIndex cond xs now (now-(now-prev)`div`2)
  |     matchNow &&     matchPrev = fastFindIndex cond xs now (now+(now-prev)`div`2) where
    matchNow  = cond(xs now)  == True
    matchPrev = cond(xs prev) == True