diff --git a/changelog.md b/changelog.md index 3d58a76c9ad41..71a77b86f932e 100644 --- a/changelog.md +++ b/changelog.md @@ -37,27 +37,21 @@ - introduced new procs in `tables.nim`: `OrderedTable.pop`, `CountTable.del`, `CountTable.pop`, `Table.pop` - To `strtabs.nim`, added `StringTable.clear` overload that reuses the existing mode. - - - Added `sugar.outplace` for turning in-place algorithms like `sort` and `shuffle` into operations that work on a copy of the data and return the mutated copy. As the existing `sorted` does. - Added `sugar.collect` that does comprehension for seq/set/table collections. - - Added `sugar.capture` for capturing some local loop variables when creating a closure. This is an enhanced version of `closureScope`. - - Added `typetraits.lenTuple` to get number of elements of a tuple/type tuple, and `typetraits.get` to get the ith element of a type tuple. - Added `typetraits.genericParams` to return a tuple of generic params from a generic instantiation - - Added `os.normalizePathEnd` for additional path sanitization. - - Added `times.fromUnixFloat,toUnixFloat`, subsecond resolution versions of `fromUnix`,`toUnixFloat`. - - Added `wrapnils` module for chains of field-access and indexing where the LHS can be nil. This simplifies code by reducing need for if-else branches around intermediate maybe nil values. Eg: `echo ?.n.typ.kind` +- Added `minIndex` and `maxIndex` to the `sequtils` module ## Library changes diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index a20f0d0b77d5b..d56742ba9012c 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -202,6 +202,41 @@ proc deduplicate*[T](s: openArray[T], isSorted: bool = false): seq[T] = for itm in items(s): if not result.contains(itm): result.add(itm) +proc minIndex*[T](s: openArray[T]): int {.since: (1, 1).} = + ## Returns the index of the minimum value of `s`. + ## ``T`` needs to have a ``<`` operator. + runnableExamples: + let + a = @[1, 2, 3, 4] + b = @[6, 5, 4, 3] + c = [2, -7, 8, -5] + d = "ziggy" + assert minIndex(a) == 0 + assert minIndex(b) == 3 + assert minIndex(c) == 1 + assert minIndex(d) == 2 + + for i in 1..high(s): + if s[i] < s[result]: result = i + +proc maxIndex*[T](s: openArray[T]): int {.since: (1, 1).} = + ## Returns the index of the maximum value of `s`. + ## ``T`` needs to have a ``<`` operator. + runnableExamples: + let + a = @[1, 2, 3, 4] + b = @[6, 5, 4, 3] + c = [2, -7, 8, -5] + d = "ziggy" + assert maxIndex(a) == 3 + assert maxIndex(b) == 0 + assert maxIndex(c) == 2 + assert maxIndex(d) == 0 + + for i in 1..high(s): + if s[i] > s[result]: result = i + + template zipImpl(s1, s2, retType: untyped): untyped = proc zip*[S, T](s1: openArray[S], s2: openArray[T]): retType = ## Returns a new sequence with a combination of the two input containers.