From a6424094365f7d63b6c9dade8f8f72ef26e92b45 Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Sun, 31 May 2009 12:41:34 -0400 Subject: strcspn and friends --- lib/js/urweb.js | 7 +++++++ lib/ur/basis.urs | 1 + lib/ur/string.ur | 8 ++++++++ lib/ur/string.urs | 3 +++ 4 files changed, 19 insertions(+) (limited to 'lib') diff --git a/lib/js/urweb.js b/lib/js/urweb.js index be3d652a..0cc66bc7 100644 --- a/lib/js/urweb.js +++ b/lib/js/urweb.js @@ -360,6 +360,13 @@ function sidx(s, ch) { else return r; } +function sspn(s, chs) { + for (var i = 0; i < s.length; ++i) + if (chs.indexOf(s[i]) != -1) + return i; + + return null; +} function schr(s, ch) { var r = s.indexOf(ch); if (r == -1) diff --git a/lib/ur/basis.urs b/lib/ur/basis.urs index d70ccc24..d3fbe037 100644 --- a/lib/ur/basis.urs +++ b/lib/ur/basis.urs @@ -59,6 +59,7 @@ val strsub : string -> int -> char val strsuffix : string -> int -> string val strchr : string -> char -> option string val strindex : string -> char -> option int +val strcspn : string -> string -> option int val substring : string -> int -> int -> string class show diff --git a/lib/ur/string.ur b/lib/ur/string.ur index e6d5903e..e31bbc27 100644 --- a/lib/ur/string.ur +++ b/lib/ur/string.ur @@ -9,6 +9,8 @@ val suffix = Basis.strsuffix val index = Basis.strindex val atFirst = Basis.strchr +fun mindex {Haystack = s, Needle = chs} = Basis.strcspn s chs + fun substring s {Start = start, Len = len} = Basis.substring s start len fun split s ch = @@ -16,3 +18,9 @@ fun split s ch = None => None | Some i => Some (substring s {Start = 0, Len = i}, substring s {Start = i + 1, Len = length s - i - 1}) +fun msplit {Haystack = s, Needle = chs} = + case mindex {Haystack = s, Needle = chs} of + None => None + | Some i => Some (substring s {Start = 0, Len = i}, + sub s i, + substring s {Start = i + 1, Len = length s - i - 1}) diff --git a/lib/ur/string.urs b/lib/ur/string.urs index 097a423f..8fd434b4 100644 --- a/lib/ur/string.urs +++ b/lib/ur/string.urs @@ -10,6 +10,9 @@ val suffix : t -> int -> string val index : t -> char -> option int val atFirst : t -> char -> option string +val mindex : {Haystack : t, Needle : t} -> option int + val substring : t -> {Start : int, Len : int} -> string val split : t -> char -> option (string * string) +val msplit : {Haystack : t, Needle : t} -> option (string * char * string) -- cgit v1.2.3