ref: 94acc736ec2d8d80533439a24742d7c796aaab4f
dir: /libstd/search.myr/
use "cmp.use" use "option.use" 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 var i for 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 }