fix: Substring.splitOn

This commit is contained in:
Wojciech Nawrocki 2021-07-14 13:02:44 -07:00 committed by Sebastian Ullrich
parent 0cf306eb49
commit b2d712a766
3 changed files with 13 additions and 8 deletions

View file

@ -396,25 +396,23 @@ partial def splitOn (s : Substring) (sep : String := " ") : List Substring :=
if sep == "" then
[s]
else
let stopPos := s.stopPos
let str := s.str
let rec loop (b i j : String.Pos) (r : List Substring) : List Substring :=
if i == stopPos then
if i == s.bsize then
let r := if sep.atEnd j then
"".toSubstring::{ str := str, startPos := b, stopPos := i-j } :: r
"".toSubstring :: s.extract b (i-j) :: r
else
{ str := str, startPos := b, stopPos := i } :: r
s.extract b i :: r
r.reverse
else if s.get i == sep.get j then
let i := s.next i
let j := sep.next j
if sep.atEnd j then
loop i i 0 ({ str := str, startPos := b, stopPos := i-j } :: r)
loop i i 0 (s.extract b (i-j) :: r)
else
loop b i j r
else
loop b (s.next i) 0 r
loop s.startPos s.startPos 0 []
loop 0 0 0 []
@[inline] def foldl {α : Type u} (f : α → Char → α) (init : α) (s : Substring) : α :=
match s with

View file

@ -53,4 +53,9 @@ it₁.remainingToString ++ "-" ++ it₂.remainingToString
def ss : Substring := "0123abcdαβγδ".toSubstring
#eval ss.drop 4 |>.takeRight 4
#eval ss.drop 4 |>.take 4
#eval ss.dropRight 4 |>.takeRight 4
#eval ss.dropRight 4 |>.takeRight 4
def ssDots : Substring := "____abc.αβγ.123.____".toSubstring.extract 4 19
#eval ssDots.splitOn "."
def ssHyphs : Substring := "____abc--αβγ--123--____".toSubstring.extract 4 22
#eval ssHyphs.splitOn "--"

View file

@ -40,3 +40,5 @@ false
"αβγδ".toSubstring
"abcd".toSubstring
"abcd".toSubstring
["abc".toSubstring, "αβγ".toSubstring, "123".toSubstring, "".toSubstring]
["abc".toSubstring, "αβγ".toSubstring, "123".toSubstring, "".toSubstring]