Skip to content

Commit

Permalink
Idxmin & idxmax, continuation (#13208)
Browse files Browse the repository at this point in the history
* Add idxmin() which returns the index of the minimum value

* Add idxmax() which returns the index of the maximum value

* Add tests for idxmin()

* Add tests for idxmax()

* Remove initialization of result = 0

* Adds overloading for arrays (no enums indexed arrays yet)

* Add support for enum index arrays

* Fix tests with enum

* Fix tests for idxmax

* Change names of the procedures to minIndex and maxIndex

* address Araq's comments:

- remove 'array' versions
- add .since pragma
- return 'int' instead of 'Natural'
- add changelog entry

Co-authored-by: Federico A. Corazza <[email protected]>
  • Loading branch information
2 people authored and Araq committed Jan 20, 2020
1 parent 0606b6a commit bf96d6d
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 7 deletions.
8 changes: 1 addition & 7 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
35 changes: 35 additions & 0 deletions lib/pure/collections/sequtils.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down

1 comment on commit bf96d6d

@kaushalmodi
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bummer, you refactored the proc names in the library but the git commit log still uses the old names idxmin and idxmax :)

Please sign in to comment.