Skip to content

Commit 64eda65

Browse files
committed
_
1 parent d8bf82e commit 64eda65

File tree

1 file changed

+44
-14
lines changed

1 file changed

+44
-14
lines changed

lib/pure/collections/sequtils.nim

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -504,19 +504,8 @@ template anyIt*(s, pred: untyped): bool =
504504
break
505505
result
506506

507-
template toSeq*(s: not iterator): untyped =
508-
## Transforms any iterable into a sequence.
509-
##
510-
## Example:
511-
##
512-
## .. code-block::
513-
## let
514-
## numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
515-
## odd_numbers = toSeq(filter(numeric) do (x: int) -> bool:
516-
## if x mod 2 == 1:
517-
## result = true)
518-
## assert odd_numbers == @[1, 3, 5, 7, 9]
519-
507+
template toSeq1(s: not iterator): untyped =
508+
# overload for typed but not iterator
520509
type outType = type(items(s))
521510
when compiles(s.len):
522511
block:
@@ -533,7 +522,8 @@ template toSeq*(s: not iterator): untyped =
533522
result.add(it)
534523
result
535524
536-
template toSeq*(iter: iterator): untyped =
525+
template toSeq2(iter: iterator): untyped =
526+
# overload for iterator
537527
evalOnceAs(iter2, iter(), false)
538528
when compiles(iter2.len):
539529
var i = 0
@@ -555,6 +545,40 @@ template toSeq*(iter: iterator): untyped =
555545
result.add(x)
556546
result
557547

548+
template toSeq*(iter: untyped): untyped =
549+
## Transforms any iterable into a sequence.
550+
##
551+
## Example:
552+
##
553+
## .. code-block::
554+
## let
555+
## numeric = @[1, 2, 3, 4, 5, 6, 7, 8, 9]
556+
## odd_numbers = toSeq(filter(numeric) do (x: int) -> bool:
557+
## if x mod 2 == 1:
558+
## result = true)
559+
## assert odd_numbers == @[1, 3, 5, 7, 9]
560+
561+
when compiles(toSeq1(iter)):
562+
toSeq1(iter)
563+
elif compiles(toSeq2(iter)):
564+
toSeq2(iter)
565+
else:
566+
# overload for untyped, eg: `toSeq(myInlineIterator(3))`
567+
when compiles(iter.len):
568+
block:
569+
evalOnceAs(iter2, iter, true)
570+
var result = newSeq[type(iter)](iter2.len)
571+
var i = 0
572+
for x in iter2:
573+
result[i] = x
574+
inc i
575+
result
576+
else:
577+
var result: seq[type(iter)] = @[]
578+
for x in iter:
579+
result.add(x)
580+
result
581+
558582
template foldl*(sequence, operation: untyped): untyped =
559583
## Template to fold a sequence from left to right, returning the accumulation.
560584
##
@@ -1063,6 +1087,12 @@ when isMainModule:
10631087
doAssert @[1,2].toSeq == @[1,2]
10641088
doAssert toSeq(@[1,2]) == @[1,2]
10651089

1090+
block:
1091+
iterator myIter(seed:int):auto=
1092+
for i in 0..<seed:
1093+
yield i
1094+
doAssert toSeq(myIter(2)) == @[0, 1]
1095+
10661096
block:
10671097
iterator myIter():auto{.inline.}=
10681098
yield 1

0 commit comments

Comments
 (0)