ref: a16c4e637079bb3d7f1cb93ae9b2348d710c003f
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 ;; }