113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// Copyright 2015 the V8 project authors. All rights reserved. 213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// Use of this source code is governed by a BSD-style license that can be 313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch// found in the LICENSE file. 413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch"use strict"; 613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochfunction makeContainerPosVisible(container, pos) { 813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch var height = container.offsetHeight; 913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch var margin = Math.floor(height / 4); 1013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (pos < container.scrollTop + margin) { 1113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch pos -= margin; 1213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (pos < 0) pos = 0; 1313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch container.scrollTop = pos; 1413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return; 1513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 1613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (pos > (container.scrollTop + 3 * margin)) { 1713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch pos = pos - 3 * margin; 1813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (pos < 0) pos = 0; 1913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch container.scrollTop = pos; 2013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 2113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 2213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 2313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 2413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochfunction lowerBound(a, value, compare, lookup) { 2513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let first = 0; 2613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let count = a.length; 2713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch while (count > 0) { 2813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let step = Math.floor(count / 2); 2913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let middle = first + step; 3013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let middle_value = (lookup === undefined) ? a[middle] : lookup(a, middle); 3113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let result = (compare === undefined) ? (middle_value < value) : compare(middle_value, value); 3213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (result) { 3313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch first = middle + 1; 3413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch count -= step + 1; 3513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } else { 3613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch count = step; 3713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 3813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 3913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return first; 4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 4313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochfunction upperBound(a, value, compare, lookup) { 4413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let first = 0; 4513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let count = a.length; 4613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch while (count > 0) { 4713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let step = Math.floor(count / 2); 4813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let middle = first + step; 4913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let middle_value = (lookup === undefined) ? a[middle] : lookup(a, middle); 5013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let result = (compare === undefined) ? (value < middle_value) : compare(value, middle_value); 5113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!result) { 5213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch first = middle + 1; 5313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch count -= step + 1; 5413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } else { 5513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch count = step; 5613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 5713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 5813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return first; 5913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 6013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 6213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochfunction sortUnique(arr, f) { 6313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch arr = arr.sort(f); 6413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch let ret = [arr[0]]; 6513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch for (var i = 1; i < arr.length; i++) { 6613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (arr[i-1] !== arr[i]) { 6713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch ret.push(arr[i]); 6813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 6913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 7013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return ret; 7113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Partial application without binding the receiver 74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochfunction partial(f) { 75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch var arguments1 = Array.prototype.slice.call(arguments, 1); 76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return function() { 77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch var arguments2 = Array.from(arguments); 78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch f.apply(this, arguments1.concat(arguments2)); 79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 81