Merge pull request #6977 from moigagoo/issue-6976

Tables: make `toCountTable` actually count the elements of the input openArray.
This commit is contained in:
Dominik Picheta 2017-12-27 15:02:25 +00:00 • committed by GitHub
commit eea08381d7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 7 deletions

View file

@ -146,7 +146,7 @@ This now needs to be written as:
- Asynchronous programming for the JavaScript backend using the `asyncjs` module. - Asynchronous programming for the JavaScript backend using the `asyncjs` module.
- Extra semantic checks for procs with noreturn pragma: return type is not allowed, - Extra semantic checks for procs with noreturn pragma: return type is not allowed,
statements after call to noreturn procs are no longer allowed. statements after call to noreturn procs are no longer allowed.
- Noreturn proc calls and raising exceptions branches are now skipped during common type - Noreturn proc calls and raising exceptions branches are now skipped during common type
deduction in if and case expressions. The following code snippets now compile: deduction in if and case expressions. The following code snippets now compile:
```nim ```nim
import strutils import strutils
@ -159,10 +159,29 @@ let b = case str:
of nil, "": raise newException(ValueError, "Invalid boolean") of nil, "": raise newException(ValueError, "Invalid boolean")
elif str.startsWith("Y"): true elif str.startsWith("Y"): true
elif str.startsWith("N"): false elif str.startsWith("N"): false
else: false else: false
let c = if str == "Y": true let c = if str == "Y": true
elif str == "N": false elif str == "N": false
else: else:
echo "invalid bool" echo "invalid bool"
quit("this is the end") quit("this is the end")
``` ```
- Proc [toCountTable](https://nim-lang.org/docs/tables.html#toCountTable,openArray[A]) now produces a `CountTable` with values correspoding to the number of occurrences of the key in the input. It used to produce a table with all values set to `1`.
Counting occurrences in a sequence used to be:
```nim
let mySeq = @[1, 2, 1, 3, 1, 4]
var myCounter = initCountTable[int]()
for item in mySeq:
myCounter.inc item
```
Now, you can simply do:
```nim
let
mySeq = @[1, 2, 1, 3, 1, 4]
myCounter = mySeq.toCountTable()
```

View file

@ -966,9 +966,10 @@ proc initCountTable*[A](initialSize=64): CountTable[A] =
newSeq(result.data, initialSize) newSeq(result.data, initialSize)
proc toCountTable*[A](keys: openArray[A]): CountTable[A] = proc toCountTable*[A](keys: openArray[A]): CountTable[A] =
## creates a new count table with every key in `keys` having a count of 1. ## creates a new count table with every key in `keys` having a count
## of how many times it occurs in `keys`.
result = initCountTable[A](rightSize(keys.len)) result = initCountTable[A](rightSize(keys.len))
for key in items(keys): result[key] = 1 for key in items(keys): result.inc key
proc `$`*[A](t: CountTable[A]): string = proc `$`*[A](t: CountTable[A]): string =
## The `$` operator for count tables. ## The `$` operator for count tables.