From a0df785c1f4fba9c863de521e4ca0ab13b00214d Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Tue, 21 Aug 2018 12:12:40 -0700 Subject: [PATCH] support all iterables with toSeq --- lib/pure/collections/sequtils.nim | 54 +++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index 3ec5709b38df1..330689c834623 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -504,19 +504,8 @@ template anyIt*(s, pred: untyped): bool = break result -template toSeq*(s: not iterator): untyped = - ## Transforms any iterable into a sequence. - ## - ## Example: - ## - ## .. code-block:: - ## let - ## numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9] - ## odd_numbers = toSeq(filter(numeric) do (x: int) -> bool: - ## if x mod 2 == 1: - ## result = true) - ## assert odd_numbers == @[1, 3, 5, 7, 9] - +template toSeq1(s: not iterator): untyped = + # overload for typed but not iterator type outType = type(items(s)) when compiles(s.len): block: @@ -533,7 +522,8 @@ template toSeq*(s: not iterator): untyped = result.add(it) result -template toSeq*(iter: iterator): untyped = +template toSeq2(iter: iterator): untyped = + # overload for iterator evalOnceAs(iter2, iter(), false) when compiles(iter2.len): var i = 0 @@ -555,6 +545,36 @@ template toSeq*(iter: iterator): untyped = result.add(x) result +template toSeq*(iter: untyped): untyped = + ## Transforms any iterable into a sequence. + runnableExamples: + import sugar + let + numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9] + odd_numbers = toSeq(filter(numeric, x => x mod 2 == 1)) + doAssert odd_numbers == @[1, 3, 5, 7, 9] + + when compiles(toSeq1(iter)): + toSeq1(iter) + elif compiles(toSeq2(iter)): + toSeq2(iter) + else: + # overload for untyped, eg: `toSeq(myInlineIterator(3))` + when compiles(iter.len): + block: + evalOnceAs(iter2, iter, true) + var result = newSeq[type(iter)](iter2.len) + var i = 0 + for x in iter2: + result[i] = x + inc i + result + else: + var result: seq[type(iter)] = @[] + for x in iter: + result.add(x) + result + template foldl*(sequence, operation: untyped): untyped = ## Template to fold a sequence from left to right, returning the accumulation. ## @@ -1063,6 +1083,12 @@ when isMainModule: doAssert @[1,2].toSeq == @[1,2] doAssert toSeq(@[1,2]) == @[1,2] + block: + iterator myIter(seed:int):auto= + for i in 0..