diff options
author | Araq <rumpf_a@web.de> | 2015-10-13 15:54:33 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-10-13 15:54:33 +0200 |
commit | aeb69dbe84e957007e529406a2a1127876f861f8 (patch) | |
tree | bc4bdb41e7aa6ef0e37281c11a895f26dcbdd930 /lib | |
parent | 8be9e4640320ddc4c11cf433fb6e232a743a9700 (diff) | |
parent | 8e0a103d7f79e913168b310ed83703244d22a0ce (diff) | |
download | Nim-aeb69dbe84e957007e529406a2a1127876f861f8.tar.gz |
Merge branch 'devel' of https://github.com/nim-lang/Nim into devel
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/collections/sequtils.nim | 93 | ||||
-rwxr-xr-x | lib/pure/unittest.nim | 3 |
2 files changed, 95 insertions, 1 deletions
diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index fd012e811..71babe93b 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -397,6 +397,67 @@ template keepItIf*(varSeq: seq, pred: expr) = inc(pos) setLen(varSeq, pos) +proc all*[T](seq1: seq[T], pred: proc(item: T): bool {.closure.}): bool = + ## Iterates through a sequence and checks if every item fulfills the + ## predicate. + ## + ## Example: + ## + ## .. code-block:: + ## let numbers = @[1, 4, 5, 8, 9, 7, 4] + ## assert all(numbers, proc (x: int): bool = return x < 10) == true + ## assert all(numbers, proc (x: int): bool = return x < 9) == false + for i in seq1: + if not pred(i): + return false + return true + +template allIt*(seq1, pred: expr): bool {.immediate.} = + ## Checks if every item fulfills the predicate. + ## + ## Example: + ## + ## .. code-block:: + ## let numbers = @[1, 4, 5, 8, 9, 7, 4] + ## assert allIt(numbers, it < 10) == true + ## assert allIt(numbers, it < 9) == false + var result {.gensym.} = true + for it {.inject.} in items(seq1): + if not pred: + result = false + break + result + +proc any*[T](seq1: seq[T], pred: proc(item: T): bool {.closure.}): bool = + ## Iterates through a sequence and checks if some item fulfills the + ## predicate. + ## + ## Example: + ## + ## .. code-block:: + ## let numbers = @[1, 4, 5, 8, 9, 7, 4] + ## assert any(numbers, proc (x: int): bool = return x > 8) == true + ## assert any(numbers, proc (x: int): bool = return x > 9) == false + for i in seq1: + if pred(i): + return true + return false + +template anyIt*(seq1, pred: expr): bool {.immediate.} = + ## Checks if some item fulfills the predicate. + ## + ## Example: + ## + ## .. code-block:: + ## let numbers = @[1, 4, 5, 8, 9, 7, 4] + ## assert anyIt(numbers, it > 8) == true + ## assert anyIt(numbers, it > 9) == false + var result {.gensym.} = false + for it {.inject.} in items(seq1): + if pred: + result = true + break + result template toSeq*(iter: expr): expr {.immediate.} = ## Transforms any iterator into a sequence. @@ -642,6 +703,38 @@ when isMainModule: keepItIf(candidates, it.len == 3 and it[0] == 'b') assert candidates == @["bar", "baz"] + block: # any + let + numbers = @[1, 4, 5, 8, 9, 7, 4] + len0seq : seq[int] = @[] + assert any(numbers, proc (x: int): bool = return x > 8) == true + assert any(numbers, proc (x: int): bool = return x > 9) == false + assert any(len0seq, proc (x: int): bool = return true) == false + + block: # anyIt + let + numbers = @[1, 4, 5, 8, 9, 7, 4] + len0seq : seq[int] = @[] + assert anyIt(numbers, it > 8) == true + assert anyIt(numbers, it > 9) == false + assert anyIt(len0seq, true) == false + + block: # all + let + numbers = @[1, 4, 5, 8, 9, 7, 4] + len0seq : seq[int] = @[] + assert all(numbers, proc (x: int): bool = return x < 10) == true + assert all(numbers, proc (x: int): bool = return x < 9) == false + assert all(len0seq, proc (x: int): bool = return false) == true + + block: # allIt + let + numbers = @[1, 4, 5, 8, 9, 7, 4] + len0seq : seq[int] = @[] + assert allIt(numbers, it < 10) == true + assert allIt(numbers, it < 9) == false + assert allIt(len0seq, false) == true + block: # toSeq test let numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9] diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim index a0f7b955e..aca9d51e2 100755 --- a/lib/pure/unittest.nim +++ b/lib/pure/unittest.nim @@ -150,6 +150,8 @@ template test*(name: expr, body: stmt): stmt {.immediate, dirty.} = try: when declared(testSetupIMPLFlag): testSetupIMPL() body + when declared(testTeardownIMPLFlag): + defer: testTeardownIMPL() except: when not defined(js): @@ -158,7 +160,6 @@ template test*(name: expr, body: stmt): stmt {.immediate, dirty.} = fail() finally: - when declared(testTeardownIMPLFlag): testTeardownIMPL() testDone name, testStatusIMPL proc checkpoint*(msg: string) = |