Adds optional maxsplit parameter to splitWhitespace (#6503) (#6690)

* Adds optional maxsplit parameter to splitWhitespace() (#6503)
* Adds an example to splitWhitespace doc comment. Minor fixes to several doc comments
This commit is contained in:
olwi 2017-11-06 10:36:06 +02:00 • committed by Andreas Rumpf
commit 0586529ff5

View file

@ -578,15 +578,46 @@ iterator split*(s: string, seps: set[char] = Whitespace,
else: else:
splitCommon(s, seps, maxsplit, 1) splitCommon(s, seps, maxsplit, 1)
iterator splitWhitespace*(s: string): string = iterator splitWhitespace*(s: string, maxsplit: int = -1): string =
## Splits at whitespace. ## Splits the string ``s`` at whitespace stripping leading and trailing
oldSplit(s, Whitespace, -1) ## whitespace if necessary. If ``maxsplit`` is specified and is positive,
## no more than ``maxsplit`` splits is made.
##
## The following code:
##
## .. code-block:: nim
## let s = " foo \t bar baz "
## for ms in [-1, 1, 2, 3]:
## echo "------ maxsplit = ", ms, ":"
## for item in s.splitWhitespace(maxsplit=ms):
## echo '"', item, '"'
##
## ...results in:
##
## .. code-block::
## ------ maxsplit = -1:
## "foo"
## "bar"
## "baz"
## ------ maxsplit = 1:
## "foo"
## "bar baz "
## ------ maxsplit = 2:
## "foo"
## "bar"
## "baz "
## ------ maxsplit = 3:
## "foo"
## "bar"
## "baz"
##
oldSplit(s, Whitespace, maxsplit)
proc splitWhitespace*(s: string): seq[string] {.noSideEffect, proc splitWhitespace*(s: string, maxsplit: int = -1): seq[string] {.noSideEffect,
rtl, extern: "nsuSplitWhitespace".} = rtl, extern: "nsuSplitWhitespace".} =
## The same as the `splitWhitespace <#splitWhitespace.i,string>`_ ## The same as the `splitWhitespace <#splitWhitespace.i,string,int>`_
## iterator, but is a proc that returns a sequence of substrings. ## iterator, but is a proc that returns a sequence of substrings.
accumulateResult(splitWhitespace(s)) accumulateResult(splitWhitespace(s, maxsplit))
iterator split*(s: string, sep: char, maxsplit: int = -1): string = iterator split*(s: string, sep: char, maxsplit: int = -1): string =
## Splits the string `s` into substrings using a single separator. ## Splits the string `s` into substrings using a single separator.
@ -671,7 +702,7 @@ iterator rsplit*(s: string, seps: set[char] = Whitespace,
maxsplit: int = -1): string = maxsplit: int = -1): string =
## Splits the string `s` into substrings from the right using a ## Splits the string `s` into substrings from the right using a
## string separator. Works exactly the same as `split iterator ## string separator. Works exactly the same as `split iterator
## <#split.i,string,char>`_ except in reverse order. ## <#split.i,string,char,int>`_ except in reverse order.
## ##
## .. code-block:: nim ## .. code-block:: nim
## for piece in "foo bar".rsplit(WhiteSpace): ## for piece in "foo bar".rsplit(WhiteSpace):
@ -691,7 +722,7 @@ iterator rsplit*(s: string, sep: char,
maxsplit: int = -1): string = maxsplit: int = -1): string =
## Splits the string `s` into substrings from the right using a ## Splits the string `s` into substrings from the right using a
## string separator. Works exactly the same as `split iterator ## string separator. Works exactly the same as `split iterator
## <#split.i,string,char>`_ except in reverse order. ## <#split.i,string,char,int>`_ except in reverse order.
## ##
## .. code-block:: nim ## .. code-block:: nim
## for piece in "foo:bar".rsplit(':'): ## for piece in "foo:bar".rsplit(':'):
@ -710,7 +741,7 @@ iterator rsplit*(s: string, sep: string, maxsplit: int = -1,
keepSeparators: bool = false): string = keepSeparators: bool = false): string =
## Splits the string `s` into substrings from the right using a ## Splits the string `s` into substrings from the right using a
## string separator. Works exactly the same as `split iterator ## string separator. Works exactly the same as `split iterator
## <#split.i,string,string>`_ except in reverse order. ## <#split.i,string,string,int>`_ except in reverse order.
## ##
## .. code-block:: nim ## .. code-block:: nim
## for piece in "foothebar".rsplit("the"): ## for piece in "foothebar".rsplit("the"):
@ -791,13 +822,13 @@ proc countLines*(s: string): int {.noSideEffect,
proc split*(s: string, seps: set[char] = Whitespace, maxsplit: int = -1): seq[string] {. proc split*(s: string, seps: set[char] = Whitespace, maxsplit: int = -1): seq[string] {.
noSideEffect, rtl, extern: "nsuSplitCharSet".} = noSideEffect, rtl, extern: "nsuSplitCharSet".} =
## The same as the `split iterator <#split.i,string,set[char]>`_, but is a ## The same as the `split iterator <#split.i,string,set[char],int>`_, but is a
## proc that returns a sequence of substrings. ## proc that returns a sequence of substrings.
accumulateResult(split(s, seps, maxsplit)) accumulateResult(split(s, seps, maxsplit))
proc split*(s: string, sep: char, maxsplit: int = -1): seq[string] {.noSideEffect, proc split*(s: string, sep: char, maxsplit: int = -1): seq[string] {.noSideEffect,
rtl, extern: "nsuSplitChar".} = rtl, extern: "nsuSplitChar".} =
## The same as the `split iterator <#split.i,string,char>`_, but is a proc ## The same as the `split iterator <#split.i,string,char,int>`_, but is a proc
## that returns a sequence of substrings. ## that returns a sequence of substrings.
accumulateResult(split(s, sep, maxsplit)) accumulateResult(split(s, sep, maxsplit))
@ -806,7 +837,7 @@ proc split*(s: string, sep: string, maxsplit: int = -1): seq[string] {.noSideEff
## Splits the string `s` into substrings using a string separator. ## Splits the string `s` into substrings using a string separator.
## ##
## Substrings are separated by the string `sep`. This is a wrapper around the ## Substrings are separated by the string `sep`. This is a wrapper around the
## `split iterator <#split.i,string,string>`_. ## `split iterator <#split.i,string,string,int>`_.
doAssert(sep.len > 0) doAssert(sep.len > 0)
accumulateResult(split(s, sep, maxsplit)) accumulateResult(split(s, sep, maxsplit))
@ -814,7 +845,7 @@ proc split*(s: string, sep: string, maxsplit: int = -1): seq[string] {.noSideEff
proc rsplit*(s: string, seps: set[char] = Whitespace, proc rsplit*(s: string, seps: set[char] = Whitespace,
maxsplit: int = -1): seq[string] maxsplit: int = -1): seq[string]
{.noSideEffect, rtl, extern: "nsuRSplitCharSet".} = {.noSideEffect, rtl, extern: "nsuRSplitCharSet".} =
## The same as the `rsplit iterator <#rsplit.i,string,set[char]>`_, but is a ## The same as the `rsplit iterator <#rsplit.i,string,set[char],int>`_, but is a
## proc that returns a sequence of substrings. ## proc that returns a sequence of substrings.
## ##
## A possible common use case for `rsplit` is path manipulation, ## A possible common use case for `rsplit` is path manipulation,
@ -836,7 +867,7 @@ proc rsplit*(s: string, seps: set[char] = Whitespace,
proc rsplit*(s: string, sep: char, maxsplit: int = -1): seq[string] proc rsplit*(s: string, sep: char, maxsplit: int = -1): seq[string]
{.noSideEffect, rtl, extern: "nsuRSplitChar".} = {.noSideEffect, rtl, extern: "nsuRSplitChar".} =
## The same as the `split iterator <#rsplit.i,string,char>`_, but is a proc ## The same as the `rsplit iterator <#rsplit.i,string,char,int>`_, but is a proc
## that returns a sequence of substrings. ## that returns a sequence of substrings.
## ##
## A possible common use case for `rsplit` is path manipulation, ## A possible common use case for `rsplit` is path manipulation,
@ -858,7 +889,7 @@ proc rsplit*(s: string, sep: char, maxsplit: int = -1): seq[string]
proc rsplit*(s: string, sep: string, maxsplit: int = -1): seq[string] proc rsplit*(s: string, sep: string, maxsplit: int = -1): seq[string]
{.noSideEffect, rtl, extern: "nsuRSplitString".} = {.noSideEffect, rtl, extern: "nsuRSplitString".} =
## The same as the `split iterator <#rsplit.i,string,string>`_, but is a proc ## The same as the `rsplit iterator <#rsplit.i,string,string,int>`_, but is a proc
## that returns a sequence of substrings. ## that returns a sequence of substrings.
## ##
## A possible common use case for `rsplit` is path manipulation, ## A possible common use case for `rsplit` is path manipulation,
@ -2599,6 +2630,12 @@ bar
doAssert s.split(' ', maxsplit=1) == @["", "this is an example "] doAssert s.split(' ', maxsplit=1) == @["", "this is an example "]
doAssert s.split(" ", maxsplit=4) == @["", "this", "is", "an", "example "] doAssert s.split(" ", maxsplit=4) == @["", "this", "is", "an", "example "]
doAssert s.splitWhitespace() == @["this", "is", "an", "example"]
doAssert s.splitWhitespace(maxsplit=1) == @["this", "is an example "]
doAssert s.splitWhitespace(maxsplit=2) == @["this", "is", "an example "]
doAssert s.splitWhitespace(maxsplit=3) == @["this", "is", "an", "example "]
doAssert s.splitWhitespace(maxsplit=4) == @["this", "is", "an", "example"]
block: # formatEng tests block: # formatEng tests
doAssert formatEng(0, 2, trim=false) == "0.00" doAssert formatEng(0, 2, trim=false) == "0.00"
doAssert formatEng(0, 2) == "0" doAssert formatEng(0, 2) == "0"