importScripts('opentally.js'); var wasm = wasm_bindgen; async function initWasm() { await wasm_bindgen('opentally_bg.wasm'); postMessage({'type': 'init', 'version': wasm.version()}); } initWasm(); onmessage = function(evt) { if (evt.data.type === 'countElection') { let numbers; if (evt.data.numbers === 'rational') { numbers = 'Rational'; } else if (evt.data.numbers === 'float64') { numbers = 'NativeFloat64'; } // Init election let election = wasm['election_from_blt_' + numbers](evt.data.electionData); // Init results table postMessage({'type': 'initResultsTable', 'content': wasm['init_results_table_' + numbers](election)}); // Init STV options let opts = wasm.STVOptions.new.apply(null, evt.data.optsStr); // Describe count postMessage({'type': 'describeCount', 'content': wasm['describe_count_' + numbers](evt.data.filePath, election, opts)}); // Step election let state = wasm['CountState' + numbers].new(election); wasm['count_init_' + numbers](state, opts); postMessage({'type': 'updateResultsTable', 'result': wasm['update_results_table_' + numbers](1, state, opts)}); postMessage({'type': 'updateStageComments', 'comment': wasm['update_stage_comments_' + numbers](state)}); for (let stageNum = 2;; stageNum++) { let isDone = wasm['count_one_stage_' + numbers](state, opts); if (isDone) { break; } postMessage({'type': 'updateResultsTable', 'result': wasm['update_results_table_' + numbers](stageNum, state, opts)}); postMessage({'type': 'updateStageComments', 'comment': wasm['update_stage_comments_' + numbers](state)}); } postMessage({'type': 'updateResultsTable', 'result': wasm['finalise_results_table_' + numbers](state)}); postMessage({'type': 'finalResultSummary', 'summary': wasm['final_result_summary_' + numbers](state)}); } }