qiao / heap.js

A binary heap implementation in CoffeeScript/JavaScript.
MIT License
125 stars 27 forks source link

Strange behavior after clone #21

Open AlexMost opened 7 years ago

AlexMost commented 7 years ago
const Heap = require('heap');

function msgidComparator(e1, e2) {
    if (e1.msgid > e2.msgid) {
        return 1;
    }
    if (e2.msgid > e1.msgid) {
        return -1;
    }
    return 0;
}

const data = [
    { msgid: 'aaaaa', msgstr: '' },
    { msgid: 'ccccc', msgstr: '' },
    { msgid: 'eeeee', msgstr: '' },
    { msgid: 'bbbb', msgstr: '' },
    { msgid: 'fffff', msgstr: '' }
]

const h = new Heap(msgidComparator);
h.push(data[0]);
h.push(data[1]);
h.push(data[2]);
h.push(data[3]);
h.push(data[4]);

const h1 = h.copy();

console.log(h1.pop());
console.log(h1.pop());
console.log(h1.pop());
console.log(h1.pop());
console.log(h1.pop());

Expected to see:

{ msgid: 'aaaaa', msgstr: '' }
{ msgid: 'bbbb', msgstr: '' }
{ msgid: 'ccccc', msgstr: '' }
{ msgid: 'eeeee', msgstr: '' }
{ msgid: 'fffff', msgstr: '' }

but have instead

{ msgid: 'aaaaa', msgstr: '' }
{ msgid: 'eeeee', msgstr: '' }
{ msgid: 'fffff', msgstr: '' }
{ msgid: 'bbbb', msgstr: '' }
{ msgid: 'ccccc', msgstr: '' }

Original object behaves well, the order is correct but clone seems to be broken.

safwan-moha commented 5 years ago

Is this project active? Shall I look in to this issue?

char8x commented 2 years ago

The same clone issue also mentioned here

KyleJune commented 2 years ago

I believe the issue is that the internal data gets copied as is but the compare function used by the heap does not get copied. The clone ends up using the default compare function for all operations done on it.