export function readFileAsync(file) { return new Promise((resolve, reject) => { let reader = new FileReader(); reader.onload = () => { resolve(reader.result); }; reader.onerror = reject; reader.readAsDataURL(file); }); } export function aggregateWordFixations(data) { //slicing off first fixation since it is the calibration in center let sorted = data.filter( item => item.word_id ).slice(1).sort((a,b) => a.word_id-b.word_id); //add first back in sorted.unshift(data[0]); //aggregate fixations for same words in bags let aggregate = sorted.reduce( (acc, val) => { if (acc[0].length == 0 || val.word_id == acc[acc.length-1][0].word_id) { acc[acc.length-1].push(val) } else { acc.push([val]); } return acc; }, [[]]); //average fixation coordinates and sum duration for each bag return aggregate.map( bag => { let word = bag[0].word; let word_id = bag[0].word_id; let x=0; let y=0; let dur=0; for (let fixation of bag) { x += fixation.x/bag.length; y += fixation.y/bag.length; dur += fixation.dur; } return {x, y, dur, word_id, word}; }); }