ref: da0fa1a6453838369e8d31f75d2a67777711adba
dir: /lib/std/search.myr/
use "cmp" use "option" pkg std = generic lsearch : (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric))) generic bsearch : (sl : @t[:], val : @t, cmp : (a : @t, b : @t -> order) -> option(@idx::(integral,numeric))) ;; /* linear search over a list of values */ generic lsearch = {sl, val, cmp for var i = 0; i < sl.len; i++ match cmp(sl[i], val) | `Equal: -> `Some i | _: /* nothing */ ;; ;; -> `None } /* binary search over a sorted list of values. */ generic bsearch = {sl, val, cmp var hi, lo, mid lo = 0 hi = sl.len - 1 while lo <= hi mid = (hi + lo) / 2 match cmp(val, sl[mid]) | `Before: hi = mid - 1 | `After: lo = mid + 1 | `Equal: -> `Some mid ;; ;; -> `None }