Be more consistent about sorting dictionary keys
This commit is contained in:
parent
335dcd2987
commit
5fa72cd25b
|
@ -195,7 +195,8 @@ proc `<`*[A, B](x: Preserve[A]; y: Preserve[B]): bool =
|
||||||
when (not A is void) and (A is B):
|
when (not A is void) and (A is B):
|
||||||
result = x.embed < y.embed
|
result = x.embed < y.embed
|
||||||
|
|
||||||
proc cmp*[E](x, y: var Preserve[E]): int =
|
func cmp*[E](x, y: Preserve[E]): int =
|
||||||
|
## Compare by Preserves total ordering.
|
||||||
if x == y: 0
|
if x == y: 0
|
||||||
elif x < y: -1
|
elif x < y: -1
|
||||||
else: 1
|
else: 1
|
||||||
|
@ -203,6 +204,10 @@ proc cmp*[E](x, y: var Preserve[E]): int =
|
||||||
proc sort*[E](pr: var Preserve[E]) = sort(pr.sequence, cmp)
|
proc sort*[E](pr: var Preserve[E]) = sort(pr.sequence, cmp)
|
||||||
## Sort a Preserves array by total ordering.
|
## Sort a Preserves array by total ordering.
|
||||||
|
|
||||||
|
proc sortDict[E](pr: var Preserve[E]) =
|
||||||
|
sort(pr.dict) do (x, y: DictEntry[E]) -> int:
|
||||||
|
cmp(x.key, y.key)
|
||||||
|
|
||||||
proc cannonicalize*[E](pr: var Preserve[E]) {.gcsafe.} =
|
proc cannonicalize*[E](pr: var Preserve[E]) {.gcsafe.} =
|
||||||
## Cannonicalize a compound Preserves value by total ordering.
|
## Cannonicalize a compound Preserves value by total ordering.
|
||||||
case pr.kind
|
case pr.kind
|
||||||
|
@ -214,8 +219,7 @@ proc cannonicalize*[E](pr: var Preserve[E]) {.gcsafe.} =
|
||||||
of pkDictionary:
|
of pkDictionary:
|
||||||
apply(pr.dict) do (e: var DictEntry[E]):
|
apply(pr.dict) do (e: var DictEntry[E]):
|
||||||
cannonicalize(e.val)
|
cannonicalize(e.val)
|
||||||
sort(pr.dict) do (x, y: DictEntry[E]) -> int:
|
sortDict(pr)
|
||||||
cmp(x.key, y.key)
|
|
||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
|
|
||||||
|
@ -943,7 +947,7 @@ proc toPreserve*[T](x: T; E = void): Preserve[E] =
|
||||||
var pr = fieldToPreserve(key, val)
|
var pr = fieldToPreserve(key, val)
|
||||||
applyEmbed(key, pr)
|
applyEmbed(key, pr)
|
||||||
result[toSymbol(key, E)] = pr
|
result[toSymbol(key, E)] = pr
|
||||||
cannonicalize(result)
|
sortDict(result)
|
||||||
else:
|
else:
|
||||||
{.warning: "failed to preserve object " & $T .}
|
{.warning: "failed to preserve object " & $T .}
|
||||||
result = toPreserveHook(x, E)
|
result = toPreserveHook(x, E)
|
||||||
|
@ -964,7 +968,7 @@ proc toPreserveHook*[A, B](table: Table[A, B]|TableRef[A, B], E: typedesc): Pres
|
||||||
result = initDictionary(E)
|
result = initDictionary(E)
|
||||||
for k, v in table.pairs:
|
for k, v in table.pairs:
|
||||||
result[toPreserve(k, E)] = toPreserve(v, E)
|
result[toPreserve(k, E)] = toPreserve(v, E)
|
||||||
cannonicalize(result)
|
sortDict(result)
|
||||||
|
|
||||||
func containsNativeEmbeds[E](pr: Preserve[E]): bool =
|
func containsNativeEmbeds[E](pr: Preserve[E]): bool =
|
||||||
## Check if a `Preserve[E]` is convertible to `Preserve[void]`.
|
## Check if a `Preserve[E]` is convertible to `Preserve[void]`.
|
||||||
|
|
Loading…
Reference in New Issue