@@ -504,19 +504,8 @@ template anyIt*(s, pred: untyped): bool =
504
504
break
505
505
result
506
506
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
520
509
type outType = type (items(s))
521
510
when compiles(s.len):
522
511
block :
@@ -533,7 +522,8 @@ template toSeq*(s: not iterator): untyped =
533
522
result .add(it)
534
523
result
535
524
536
- template toSeq*(iter: iterator): untyped =
525
+ template toSeq2(iter: iterator): untyped =
526
+ # overload for iterator
537
527
evalOnceAs(iter2, iter(), false)
538
528
when compiles(iter2.len):
539
529
var i = 0
@@ -555,6 +545,40 @@ template toSeq*(iter: iterator): untyped =
555
545
result .add(x)
556
546
result
557
547
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
+
558
582
template foldl* (sequence, operation: untyped ): untyped =
559
583
# # Template to fold a sequence from left to right, returning the accumulation.
560
584
# #
@@ -1063,6 +1087,12 @@ when isMainModule:
1063
1087
doAssert @ [1 ,2 ].toSeq == @ [1 ,2 ]
1064
1088
doAssert toSeq(@ [1 ,2 ]) == @ [1 ,2 ]
1065
1089
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
+
1066
1096
block :
1067
1097
iterator myIter():auto {.inline.}=
1068
1098
yield 1
0 commit comments