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