Implement set with HashSet rather than CountTable
I didn't know HashSet was a thing.
This commit is contained in:
parent
db3e302067
commit
32ce6a71fe
|
@ -1,6 +1,6 @@
|
|||
# SPDX-License-Identifier: ISC
|
||||
|
||||
import base64, endians, json, hashes, tables, streams
|
||||
import base64, endians, json, hashes, sets, streams, tables
|
||||
import bigints
|
||||
|
||||
type
|
||||
|
@ -33,7 +33,7 @@ type
|
|||
of pkSequence:
|
||||
seq*: seq[Preserve[T]]
|
||||
of pkSet:
|
||||
set*: CountTable[Preserve[T]]
|
||||
set*: HashSet[Preserve[T]]
|
||||
of pkDictionary:
|
||||
dict*: Table[Preserve[T], Preserve[T]]
|
||||
of pkEmbedded:
|
||||
|
@ -76,7 +76,7 @@ proc `$`*[T](prs: Preserve[T]): string =
|
|||
result.add(']')
|
||||
of pkSet:
|
||||
result.add("#{")
|
||||
for val in prs.set.keys:
|
||||
for val in prs.set:
|
||||
result.add($val)
|
||||
result.add(' ')
|
||||
if result.len > 1:
|
||||
|
@ -208,10 +208,10 @@ proc `==`*[T](x, y: Preserve[T]): bool =
|
|||
if y.seq[i] != val: return false
|
||||
result = true
|
||||
of pkSet:
|
||||
for val in x.set.keys:
|
||||
if not y.set.hasKey(val): return false
|
||||
for val in y.set.keys:
|
||||
if not x.set.hasKey(val): return false
|
||||
for val in x.set:
|
||||
if not y.set.contains(val): return false
|
||||
for val in y.set:
|
||||
if not x.set.contains(val): return false
|
||||
result = true
|
||||
of pkDictionary:
|
||||
for (key, val) in x.dict.pairs:
|
||||
|
@ -248,7 +248,7 @@ proc hash*[T](prs: Preserve[T]): Hash =
|
|||
for val in prs.seq:
|
||||
h = h !& hash(val)
|
||||
of pkSet:
|
||||
for val in prs.set.keys:
|
||||
for val in prs.set:
|
||||
h = h !& hash(val)
|
||||
of pkDictionary:
|
||||
for (key, val) in prs.dict.pairs:
|
||||
|
@ -359,8 +359,8 @@ proc write*[T](str: Stream; prs: Preserve[T]) =
|
|||
str.write(0x84'u8)
|
||||
of pkSet:
|
||||
str.write(0xb6'u8)
|
||||
for key in prs.set.keys:
|
||||
str.write(key)
|
||||
for val in prs.set.items:
|
||||
str.write(val)
|
||||
str.write(0x84'u8)
|
||||
of pkDictionary:
|
||||
str.write(0xb7'u8)
|
||||
|
@ -423,8 +423,8 @@ proc parsePreserve*(s: Stream): Preserve[void] =
|
|||
of 0xb6:
|
||||
result = Preserve[void](kind: pkSet)
|
||||
while s.peekUint8() != endMarker:
|
||||
let key = s.parsePreserve()
|
||||
result.set[key] = 0
|
||||
let val = s.parsePreserve()
|
||||
result.set.incl(val)
|
||||
discard s.readUint8()
|
||||
of 0xb7:
|
||||
result = Preserve[void](kind: pkDictionary)
|
||||
|
|
Loading…
Reference in New Issue