From c36d7ffc7c771fcece05bf882fee02fae4261edf Mon Sep 17 00:00:00 2001 From: Konstantin Molchanov Date: Wed, 27 Dec 2017 13:30:32 +0400 Subject: [PATCH 1/3] Tables: make `toCountTable` actually count the elements of the input openArray. --- lib/pure/collections/tables.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 01767956ea..d8c133bce3 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -968,7 +968,7 @@ proc initCountTable*[A](initialSize=64): 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. 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 = ## The `$` operator for count tables. From b592f069bbc2d30f11fd9414e149025653425dc0 Mon Sep 17 00:00:00 2001 From: Konstantin Molchanov Date: Wed, 27 Dec 2017 13:44:47 +0400 Subject: [PATCH 2/3] Tables: toCountTable: Update docs. --- lib/pure/collections/tables.nim | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index d8c133bce3..777beabc39 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -966,7 +966,8 @@ proc initCountTable*[A](initialSize=64): CountTable[A] = newSeq(result.data, initialSize) 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)) for key in items(keys): result.inc key From a8b0a8a92da03593c3fe52dfbca8ee4eeed286d3 Mon Sep 17 00:00:00 2001 From: Konstantin Molchanov Date: Wed, 27 Dec 2017 17:29:39 +0400 Subject: [PATCH 3/3] Changelog: Document `toCountTable` behaviour change. --- changelog.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/changelog.md b/changelog.md index 5734a4cb12..de4b2f251b 100644 --- a/changelog.md +++ b/changelog.md @@ -146,7 +146,7 @@ This now needs to be written as: - Asynchronous programming for the JavaScript backend using the `asyncjs` module. - Extra semantic checks for procs with noreturn pragma: return type is not 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: ```nim import strutils @@ -159,10 +159,29 @@ let b = case str: of nil, "": raise newException(ValueError, "Invalid boolean") elif str.startsWith("Y"): true elif str.startsWith("N"): false - else: false -let c = if str == "Y": true - elif str == "N": false + else: false +let c = if str == "Y": true + elif str == "N": false else: - echo "invalid bool" + echo "invalid bool" 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() +```