ref: 04d647955b3d83e2fb3731d63887ae499809141e
dir: /libstd/strfind.myr/
use "types.use" use "option.use" pkg std = const strfind : (haystack : byte[:], needle : byte[:] -> option(size)) const strrfind : (haystack : byte[:], needle : byte[:] -> option(size)) const strhas : (haystack : byte[:], needle : byte[:] -> bool) ;; const strfind = {haystack, needle -> strfindin(haystack, needle, 0, haystack.len) } const strrfind = {haystack, needle -> strfindin(haystack, needle, haystack.len - 1, -1) } const strfindin = {haystack, needle, start, end var i, j, inc : size inc = 1 if start > end inc = -1 ;; for i = start; i != end; i += inc /* if we knew the direction we could terminate early, but we allow the start and end to be passed in. */ if i + needle.len > haystack.len continue ;; if haystack[i] == needle[0] for j = 0; j < needle.len; j++ if haystack[i + j] != needle[j] goto nextiter ;; ;; -> `Some i ;; :nextiter ;; -> `None } const strhas = {haystack, needle match strfind(haystack, needle) | `Some _: -> true | `None: -> false ;; }