fix bug in dict comparison
This commit is contained in:
parent
41a5335d87
commit
5d028fe030
3 changed files with 39 additions and 7 deletions
|
|
@ -77,8 +77,10 @@ export const compareDicts = compareKeys => compareValues => x => y => {
|
||||||
// because of the underlying red-black tree, iteration happens in ordered fashion
|
// because of the underlying red-black tree, iteration happens in ordered fashion
|
||||||
const iterate = iterX => iterY =>
|
const iterate = iterX => iterY =>
|
||||||
match(readDict(iterX))
|
match(readDict(iterX))
|
||||||
(entryX =>
|
(_ => 0) // end of iteration (dicts are equal)
|
||||||
|
(entryX => // entry...
|
||||||
match(readDict(iterY))
|
match(readDict(iterY))
|
||||||
|
(_ => {throw new Error("this can never happen");})
|
||||||
(entryY => compareKeys
|
(entryY => compareKeys
|
||||||
(getLeft(getLeft(entryX)))
|
(getLeft(getLeft(entryX)))
|
||||||
(getLeft(getLeft(entryY)))
|
(getLeft(getLeft(entryY)))
|
||||||
|
|
@ -87,9 +89,9 @@ export const compareDicts = compareKeys => compareValues => x => y => {
|
||||||
(getRight(getLeft(entryY)))
|
(getRight(getLeft(entryY)))
|
||||||
|| iterate
|
|| iterate
|
||||||
(getRight(entryX))
|
(getRight(entryX))
|
||||||
(getRight(entryY)))
|
(getRight(entryY))
|
||||||
(_ => 0))
|
)
|
||||||
(_ => 0); // we made it, dicts are equal
|
);
|
||||||
return iterate(firstDict(x))(firstDict(y));
|
return iterate(firstDict(x))(firstDict(y));
|
||||||
})();
|
})();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { unit } from "../primitives/unit.js";
|
||||||
import { RBTreeWrapper } from "../util/rbtree_wrapper.js";
|
import { RBTreeWrapper } from "../util/rbtree_wrapper.js";
|
||||||
import { indent } from "../util/util.js";
|
import { indent } from "../util/util.js";
|
||||||
import { newProduct } from "./product.js";
|
import { newProduct } from "./product.js";
|
||||||
|
|
@ -32,13 +33,13 @@ export const last = dict => dict.tree.end;
|
||||||
export const read = iter => {
|
export const read = iter => {
|
||||||
if (iter !== undefined && iter.valid) {
|
if (iter !== undefined && iter.valid) {
|
||||||
return newRight(
|
return newRight(
|
||||||
newProduct(
|
newProduct
|
||||||
newProduct(iter.key)(iter.value)
|
(newProduct(iter.key)(iter.value))
|
||||||
(iter.clone().next())
|
(iter.clone().next())
|
||||||
)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
// end of iteration
|
||||||
return newLeft(unit);
|
return newLeft(unit);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
29
tests/dict.js
Normal file
29
tests/dict.js
Normal file
|
|
@ -0,0 +1,29 @@
|
||||||
|
import assert from "node:assert";
|
||||||
|
|
||||||
|
import { compareInts, compareStrings } from "../lib/compare/primitives.js";
|
||||||
|
import { compareDicts } from "../lib/compare/structures.js";
|
||||||
|
import { emptyDict, set } from "../lib/structures/dict.js";
|
||||||
|
|
||||||
|
const cmpFn = compareDicts(compareStrings)(compareInts);
|
||||||
|
|
||||||
|
const e = emptyDict(compareStrings);
|
||||||
|
const f = set(e)("x")(1n);
|
||||||
|
const g = set(f)("y")(2n);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
cmpFn(e)(e),
|
||||||
|
0,
|
||||||
|
"empty dict should be equal to itself"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
cmpFn(g)(g),
|
||||||
|
0,
|
||||||
|
"dict should always equal itself"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.equal(
|
||||||
|
cmpFn(f)(g),
|
||||||
|
-1,
|
||||||
|
"f is smaller"
|
||||||
|
);
|
||||||
Loading…
Add table
Add a link
Reference in a new issue