loader: build_module_importation invalidates the mmodule on errors
[nit.git] / lib / standard / string_search.nit
index fcf14c7..3a885ad 100644 (file)
@@ -85,6 +85,7 @@ interface Pattern
                return res
        end
 
+       # Is `self` in `s`?
        protected fun is_in(s: Text): Bool do return search_index_in(s, 0) != -1
 end
 
@@ -204,7 +205,6 @@ class BM_Pattern
 
        private fun compute_gs
        do
-               var x = _motif
                var m = _length
                var suff = suffixes
                var i = 0
@@ -327,6 +327,37 @@ redef class Text
        #     assert "I say hello to the world!".search_from("hello",7)       == null
        fun search_from(p: Pattern, from: Int): nullable Match do return p.search_in(self, from)
 
+       # Search the last occurence of the text `t`.
+       #
+       #     assert "bob".search_last("b").from == 2
+       #     assert "bob".search_last("bo").from == 0
+       #     assert "bob".search_last("ob").from == 1
+       #     assert "bobob".search_last("ob").from == 3
+       #     assert "bobbob".search_last("bb").from == 2
+       #     assert "bobbob".search_last("bob").from == 3
+       #     assert "bob".search_last("z") == null
+       #     assert "".search_last("b") == null
+       fun search_last(t: Text): nullable Match do
+               return search_last_up_to(t, length)
+       end
+
+       # Search the last occurence of the text `t` before `up_to`.
+       #
+       #     assert "bobbob".search_last_up_to("b", 3).from == 2
+       #     assert "bobbob".search_last_up_to("b", 6).from == 5
+       #     assert "bobbob".search_last_up_to("b", 0) == null
+       fun search_last_up_to(t: Text, up_to: Int): nullable Match do
+               var i = up_to - t.length
+
+               while i >= 0 do
+                       if substring(i, t.length) == t then
+                               return new Match(self.to_s, i, t.length)
+                       end
+                       i -= 1
+               end
+               return null
+       end
+
        # Search all occurrences of p into self.
        #
        #     var a = new Array[Int]
@@ -339,16 +370,16 @@ redef class Text
        # Split `self` using `p` as separator.
        #
        #     assert "hello world".split('o')          ==  ["hell", " w", "rld"]
-       fun split(p: Pattern): Array[SELFTYPE]
+       fun split(p: Pattern): Array[String]
        do
                var matches = p.split_in(self)
-               var res = new Array[SELFTYPE].with_capacity(matches.length)
+               var res = new Array[String].with_capacity(matches.length)
                for m in matches do res.add(m.to_s)
                return res
        end
 
        # @deprecated alias for `split`
-       fun split_with(p: Pattern): Array[SELFTYPE] do return self.split(p)
+       fun split_with(p: Pattern): Array[String] do return self.split(p)
 
        # Split `self` on the first `=`
        #
@@ -365,7 +396,7 @@ redef class Text
        #
        #     assert "hlelo".replace("le", "el")             ==  "hello"
        #     assert "hello".replace('l', "")        ==  "heo"
-       fun replace(p: Pattern, string: SELFTYPE): SELFTYPE
+       fun replace(p: Pattern, string: SELFTYPE): String
        do
                return self.split_with(p).join(string)
        end