{"action":"created","comment":{"url":"https://api.github.com/repos/scala-js/scala-js/pulls/comments/32412504","id":32412504,"diff_hunk":"@@ -0,0 +1,1131 @@\n+package java.util\n+\n+import java.{lang => jl, io}\n+\n+import scala.annotation.tailrec\n+import scala.language.implicitConversions\n+import scala.collection.JavaConversions._\n+\n+object Collections {\n+\n+  import WrappedCollections._\n+  import ImmutableCollections._\n+  import CheckedCollections._\n+\n+  final lazy val EMPTY_SET: Set[_] = {\n+    unmodifiableSet(\n+      new AbstractSet[Any] with io.Serializable {\n+        override def size(): Int = 0\n+\n+        override def iterator(): Iterator[Any] = emptyIterator[Any]\n+      })\n+  }\n+\n+  final lazy val EMPTY_LIST: List[_] = {\n+    unmodifiableList(\n+      new AbstractList[Any] with io.Serializable {\n+        override def get(index: Int): Any =\n+          throw new IndexOutOfBoundsException(index.toString)\n+\n+        override def size(): Int = 0\n+      })\n+  }\n+\n+  final lazy val EMPTY_MAP: Map[_, _] = {\n+    unmodifiableMap[Any, Any](\n+      new AbstractMap[Any, Any] with io.Serializable {\n+        override def entrySet(): Set[Map.Entry[Any, Any]] =\n+          EMPTY_SET.asInstanceOf[Set[Map.Entry[Any, Any]]]\n+      })\n+  }\n+\n+  def sort[T <: jl.Comparable[T]](list: List[T]): Unit =\n+    sort(list, makeComparator[T])\n+\n+  def sort[T](list: List[T], c: Comparator[_ >: T]): Unit = {\n+    val sortedList = list.sorted(c)\n+    (0 until list.size).foreach(i => list(i) = sortedList(i))\n+  }\n+\n+  def binarySearch[T](list: List[_ <: jl.Comparable[T]], key: T): Int =\n+    binarySearchCore(list, (elem: Comparable[T]) => elem.compareTo(key))\n+\n+  def binarySearch[T](list: List[_ <: T], key: T, c: Comparator[_ >: T]): Int =\n+    binarySearchCore(list, (elem: T) => c.compare(elem, key))\n+\n+  def reverse(list: List[_]): Unit = {\n+    val _list = list.asInstanceOf[List[AnyRef]]\n+    val it1 = _list.listIterator()\n+    val it2 = _list.listIterator(_list.size)\n+    for (i <- 0 until _list.size / 2) {\n+      val tmp = it1.next()\n+      it1.set(it2.previous())\n+      it2.set(tmp)\n+    }\n+  }\n+\n+  def shuffle(list: List[_]): Unit =\n+    shuffle(list, new Random)\n+\n+  def shuffle(list: List[_], rnd: Random): Unit = {\n+    val _list = list.asInstanceOf[List[AnyRef]]\n+    val scalaRnd = scala.util.Random.javaRandomToRandom(rnd)\n+    val shuffledList = scalaRnd.shuffle(_list.toSeq)\n+    (0 until list.size).foreach(i => _list(i) = shuffledList(i))\n+  }\n+\n+  def swap(list: List[_], i: Int, j: Int): Unit =\n+    swapCore(list, i, j, true)\n+\n+  def fill[T](list: List[_ >: T], obj: T): Unit = {\n+    @tailrec\n+    def fillNext(iter: ListIterator[_ >: T]): Unit = {\n+      if (iter.hasNext) {\n+        iter.next()\n+        iter.set(obj)\n+        fillNext(iter)\n+      }\n+    }\n+    fillNext(list.listIterator)\n+  }\n+\n+  def copy[T](dest: List[_ >: T], src: List[_ <: T]): Unit = {\n+    @tailrec\n+    def copy(iterDest: ListIterator[_ >: T], iterSrc: ListIterator[_ <: T]): Unit = {\n+      if (iterSrc.hasNext) {\n+        if (iterDest.hasNext) {\n+          iterDest.next()\n+          iterDest.set(iterSrc.next())\n+          copy(iterDest, iterSrc)\n+        } else\n+          throw new IndexOutOfBoundsException\n+      }\n+    }\n+    copy(dest.listIterator, src.listIterator)\n+  }\n+\n+  def min[T <: AnyRef with jl.Comparable[T]](coll: Collection[_ <: T]): T =\n+    min(coll, makeComparator[T])\n+\n+  def min[T](coll: Collection[_ <: T], comp: Comparator[_ >: T]): T =\n+    coll.min(comp)\n+\n+  def max[T <: AnyRef with jl.Comparable[T]](coll: Collection[_ <: T]): T =\n+    max(coll, makeComparator[T])\n+\n+  def max[T](coll: Collection[_ <: T], comp: Comparator[_ >: T]): T =\n+    coll.max(comp)\n+\n+  def rotate(list: List[_], distance: Int): Unit = {\n+    val listSize = list.size\n+    if (listSize > 1 && distance % listSize != 0) {\n+      def exchangeRotation(): Unit = {\n+        val _list = list.asInstanceOf[List[AnyRef]]\n+        @tailrec\n+        def rotateNext(index: Int, value: AnyRef): Unit = {\n+          val nextValue = _list(index)\n+          _list(index) = value\n+          if (index != 0)\n+            rotateNext(modulo(index + distance, listSize), nextValue)\n+        }\n+        rotateNext(modulo(distance, listSize), _list(0))\n+      }\n+\n+      def splitReverseRotation(): Unit = {\n+        val splitPoint = modulo(-distance, listSize)\n+        reverse(list.subList(0, splitPoint))\n+        reverse(list.subList(splitPoint, listSize))\n+        reverse(list)\n+      }\n+\n+      list match {\n+        case _: RandomAccess    => exchangeRotation()\n+        case _ if listSize < 16 => exchangeRotation() // TODO benchmark and set proper limit\n+        case _                  => splitReverseRotation()\n+      }\n+    }\n+  }\n+\n+  def replaceAll[T](list: List[T], oldVal: T, newVal: T): Boolean = {\n+    @tailrec\n+    def replaceAll(iter: ListIterator[T], mod: Boolean): Boolean = {\n+      if (iter.hasNext) {\n+        val isEqual = iter.next() === oldVal\n+        if (isEqual)\n+         iter.set(newVal)\n+        replaceAll(iter, mod || isEqual)\n+      } else {\n+        mod\n+      }\n+    }\n+    replaceAll(list.listIterator(), false)\n+  }\n+\n+  def indexOfSubList(source: List[_], target: List[_]): Int =\n+    indexOfSubListCore(source, target, true)\n+\n+  def lastIndexOfSubList(source: List[_], target: List[_]): Int =\n+    indexOfSubListCore(source, target, false)\n+\n+  def unmodifiableCollection[T](c: Collection[_ <: T]): Collection[T] = {\n+    class BasicImmutableCollection\n+      extends ImmutableCollection[T, Collection[T]] {\n+      override protected val inner: Collection[T] = c.asInstanceOf[Collection[T]]\n+\n+      override def equals(obj: Any): Boolean =\n+        this eq obj.asInstanceOf[AnyRef]\n+\n+      override def hashCode(): Int =\n+        System.identityHashCode(this)\n+    }\n+    c match {\n+      case _: Serializable => new BasicImmutableCollection with Serializable\n+      case _               => new BasicImmutableCollection\n+    }\n+  }\n+\n+  def unmodifiableSet[T](a: Set[_ <: T]): Set[T] = {\n+    class BasicImmutableSet extends ImmutableSet[T, Set[T]] {\n+      override protected val inner: Set[T] = a.asInstanceOf[Set[T]]\n+    }\n+    a match {\n+      case _: Serializable => new BasicImmutableSet with Serializable\n+      case _               => new BasicImmutableSet\n+    }\n+  }\n+\n+  def unmodifiableSortedSet[T](s: SortedSet[T]): SortedSet[T] = {\n+    class BasicImmutableSortedSet extends ImmutableSortedSet[T] {\n+      override protected val inner: SortedSet[T] = s\n+    }\n+    s match {\n+      case _: Serializable => new BasicImmutableSortedSet with Serializable\n+      case _               => new BasicImmutableSortedSet\n+    }\n+  }\n+\n+  def unmodifiableList[T](list: List[_ <: T]): List[T] = {\n+    class BasicImmutableList\n+      extends ImmutableList[T] {\n+      override protected val inner: List[T] =\n+        list.asInstanceOf[List[T]]\n+    }\n+    list match {\n+      case _: Serializable with RandomAccess =>\n+        new BasicImmutableList with Serializable with RandomAccess\n+      case _: Serializable => new BasicImmutableList with Serializable\n+      case _: RandomAccess => new BasicImmutableList with RandomAccess\n+      case _               => new BasicImmutableList\n+    }\n+  }\n+\n+  def unmodifiableMap[K, V](m: Map[_ <: K, _ <: V]): Map[K, V] = {\n+    class BasicImmutableMap extends ImmutableMap[K, V, Map[K, V]] {\n+      override protected val inner: Map[K, V] = m.asInstanceOf[Map[K, V]]\n+    }\n+    m match {\n+      case _: Serializable => new BasicImmutableMap with Serializable\n+      case _ => new BasicImmutableMap\n+    }\n+  }\n+\n+  def unmodifiableSortedMap[K, V](m: SortedMap[K, _ <: V]): SortedMap[K, V] = {\n+    class BasicImmutableSortedMap\n+      extends ImmutableSortedMap[K, V] {\n+      override protected val inner: SortedMap[K, V] = m.asInstanceOf[SortedMap[K, V]]\n+    }\n+    m match {\n+      case _: Serializable => new BasicImmutableSortedMap with Serializable\n+      case _               => new BasicImmutableSortedMap\n+    }\n+  }\n+\n+  def synchronizedCollection[T](c: Collection[T]): Collection[T] = {\n+    class BasicSynchronizedCollection\n+      extends WrappedCollection[T, Collection[T]] {\n+      override protected val inner: Collection[T] = c\n+\n+      override def equals(obj: Any): Boolean =\n+        this eq obj.asInstanceOf[AnyRef]\n+\n+      override def hashCode(): Int =\n+        System.identityHashCode(this)\n+    }\n+    c match {\n+      case _: Serializable => new BasicSynchronizedCollection with Serializable\n+      case _               => new BasicSynchronizedCollection\n+    }\n+  }\n+\n+  def synchronizedSet[T](s: Set[T]): Set[T] = {\n+    class BasicSynchronizedSet extends WrappedSet[T, Set[T]] {\n+      override protected val inner: Set[T] = s\n+    }\n+    s match {\n+      case _: Serializable => new BasicSynchronizedSet with Serializable\n+      case _               => new BasicSynchronizedSet\n+    }\n+  }\n+\n+  def synchronizedSortedSet[T](s: SortedSet[T]): SortedSet[T] = {\n+    class BasicSynchronizedSortedSet extends WrappedSortedSet[T] {\n+      override protected val inner: SortedSet[T] = s\n+    }\n+    s match {\n+      case _: Serializable => new BasicSynchronizedSortedSet with Serializable\n+      case _               => new BasicSynchronizedSortedSet\n+    }\n+  }\n+\n+  def synchronizedList[T](list: List[T]): List[T] = {\n+    class BasicSynchronizedList extends WrappedList[T] {\n+      override protected val inner: List[T] = list\n+    }\n+    list match {\n+      case _: Serializable with RandomAccess =>\n+        new BasicSynchronizedList with Serializable with RandomAccess\n+      case _: Serializable => new BasicSynchronizedList with Serializable\n+      case _: RandomAccess => new BasicSynchronizedList with RandomAccess\n+      case _               => new BasicSynchronizedList\n+    }\n+  }\n+\n+  def synchronizedMap[K, V](m: Map[K, V]): Map[K, V] = {\n+    class BasicSynchronizedMap extends WrappedMap[K, V, Map[K, V]] {\n+      override protected val inner: Map[K, V] = m\n+    }\n+    m match {\n+      case _: Serializable => new BasicSynchronizedMap with Serializable\n+      case _               => new BasicSynchronizedMap\n+    }\n+  }\n+\n+  def synchronizedSortedMap[K, V](m: SortedMap[K, V]): SortedMap[K, V] = {\n+    class BasicSynchronizedSortedMap extends WrappedSortedMap[K, V] {\n+      override protected val inner: SortedMap[K, V] = m\n+    }\n+    m match {\n+      case _: Serializable => new BasicSynchronizedSortedMap with Serializable\n+      case _               => new BasicSynchronizedSortedMap\n+    }\n+  }\n+\n+  def checkedCollection[E](c: Collection[E], typ: Class[E]): Collection[E] = {\n+    class BasicCheckedCollection\n+      extends CheckedCollection[E, Collection[E]] {\n+      override protected val elemClazz: Class[E] = typ\n+      override protected val inner: Collection[E] = c\n+\n+      override def equals(obj: Any): Boolean =\n+        this eq obj.asInstanceOf[AnyRef]\n+\n+      override def hashCode(): Int =\n+        System.identityHashCode(this)\n+    }\n+    c match {\n+      case _: Serializable => new BasicCheckedCollection with Serializable\n+      case _               => new BasicCheckedCollection\n+    }\n+  }\n+\n+  def checkedSet[E](s: Set[E], typ: Class[E]): Set[E] = {\n+    class BasicCheckedSet extends CheckedSet[E, Set[E]] {\n+      override protected val elemClazz: Class[E] = typ\n+      override protected val inner: Set[E] = s\n+    }\n+    s match {\n+      case _: Serializable => new BasicCheckedSet with Serializable\n+      case _               => new BasicCheckedSet\n+    }\n+  }\n+\n+  def checkedSortedSet[E](s: SortedSet[E], typ: Class[E]): SortedSet[E] = {\n+    class BasicCheckedSortedSet extends CheckedSortedSet[E] {\n+      override protected val elemClazz: Class[E] = typ\n+      override protected val inner: SortedSet[E] = s\n+    }\n+    s match {\n+      case _: Serializable => new BasicCheckedSortedSet with Serializable\n+      case _               => new BasicCheckedSortedSet\n+    }\n+  }\n+\n+  def checkedList[E](list: List[E], typ: Class[E]): List[E] = {\n+    class BasicCheckedList extends CheckedList[E] {\n+      protected val elemClazz: Class[E] = typ\n+      protected val inner: List[E] = list\n+    }\n+    list match {\n+      case _: Serializable with RandomAccess =>\n+        new BasicCheckedList with Serializable with RandomAccess\n+      case _: Serializable => new BasicCheckedList with Serializable\n+      case _: RandomAccess => new BasicCheckedList with RandomAccess\n+      case _               => new BasicCheckedList\n+    }\n+  }\n+\n+  def checkedMap[K, V](m: Map[K, V], keyType: Class[K], valueType: Class[V]): Map[K, V] = {\n+    class BasicCheckedMap extends CheckedMap[K, V, Map[K, V]] {\n+      protected def keyClazz: Class[K] = keyType\n+      protected def valueClazz: Class[V] = valueType\n+      protected val inner: Map[K, V] = m\n+    }\n+    m match {\n+      case _: Serializable => new BasicCheckedMap with Serializable\n+      case _               => new BasicCheckedMap\n+    }\n+  }\n+\n+  def checkedSortedMap[K, V](m: SortedMap[K, V], keyType: Class[K], valueType: Class[V]): SortedMap[K, V] = {\n+    class BasicCheckedSortedMap extends CheckedSortedMap[K, V] {\n+      protected def keyClazz: Class[K] = keyType\n+      protected def valueClazz: Class[V] = valueType\n+      protected val inner: SortedMap[K, V] = m\n+    }\n+    m match {\n+      case _: Serializable => new BasicCheckedSortedMap with Serializable\n+      case _               => new BasicCheckedSortedMap\n+    }\n+  }\n+\n+  def emptyIterator[T](): Iterator[T] = {\n+    new Iterator[T] {\n+      override def hasNext: Boolean = false\n+\n+      override def next(): T =\n+        throw new NoSuchElementException\n+\n+      override def remove(): Unit =\n+        throw new IllegalStateException\n+    }\n+  }\n+\n+  def emptyListIterator[T](): ListIterator[T] = {\n+    new ListIterator[T] {\n+      override def hasNext: Boolean = false\n+\n+      override def next(): T =\n+        throw new NoSuchElementException\n+\n+      override def hasPrevious: Boolean = false\n+\n+      override def previous(): T =\n+        throw new NoSuchElementException\n+\n+      override def nextIndex(): Int = 0\n+\n+      override def previousIndex(): Int = -1\n+\n+      override def remove(): Unit =\n+        throw new IllegalStateException\n+\n+      override def set(e: T): Unit =\n+        throw new IllegalStateException\n+\n+      override def add(e: T): Unit =\n+        throw new UnsupportedOperationException\n+    }\n+  }\n+\n+  def emptyEnumeration[T](): Enumeration[T] = {\n+    new Enumeration[T] {\n+      def hasMoreElements: Boolean = false\n+\n+      def nextElement(): T =\n+        throw new NoSuchElementException\n+    }\n+  }\n+\n+  final def emptySet[T](): Set[T] =\n+    EMPTY_SET.asInstanceOf[Set[T]]\n+\n+  final def emptyList[T](): List[T] =\n+    EMPTY_LIST.asInstanceOf[List[T]]\n+\n+  final def emptyMap[K, V](): Map[K, V] =\n+    EMPTY_MAP.asInstanceOf[Map[K, V]]\n+\n+  def singleton[T](o: T): Set[T] = {\n+    unmodifiableSet(new AbstractSet[T] with io.Serializable {\n+      def size(): Int = 1\n+\n+      def iterator(): Iterator[T] = {\n+        new Iterator[T] {\n+          private var _hasNext: Boolean = true\n+\n+          def hasNext: Boolean = _hasNext\n+\n+          def next(): T = {\n+            if (!_hasNext)\n+              throw new IllegalStateException\n+            _hasNext = false\n+            o\n+          }\n+\n+          def remove(): Unit =\n+            throw new UnsupportedOperationException\n+        }\n+      }\n+    })\n+  }\n+\n+  def singletonList[T](o: T): List[T] = {\n+    unmodifiableList(new AbstractList[T] with io.Serializable {\n+      def size(): Int = 1\n+\n+      def get(index: Int): T =\n+        if (index === 0) o\n+        else throw new IndexOutOfBoundsException(index.toString)\n+    })\n+  }\n+\n+  def singletonMap[K, V](key: K, value: V): Map[K, V] = {\n+    unmodifiableMap[K, V](new AbstractMap[K, V] with io.Serializable {\n+      def entrySet(): Set[Map.Entry[K, V]] =\n+        singleton(new AbstractMap.SimpleImmutableEntry(key, value))\n+    })\n+  }\n+\n+  def nCopies[T](n: Int, o: T): List[T] = {\n+    if (n < 0)\n+      throw new IllegalArgumentException\n+\n+    unmodifiableList(new AbstractList[T] with RandomAccess {","path":"javalib/src/main/scala/java/util/Collections.scala","position":493,"original_position":493,"commit_id":"75b499e057249ac56ea2f46fd902a10a330592f8","original_commit_id":"75b499e057249ac56ea2f46fd902a10a330592f8","user":{"login":"sjrd","id":535934,"avatar_url":"https://avatars.githubusercontent.com/u/535934?v=3","gravatar_id":"","url":"https://api.github.com/users/sjrd","html_url":"https://github.com/sjrd","followers_url":"https://api.github.com/users/sjrd/followers","following_url":"https://api.github.com/users/sjrd/following{/other_user}","gists_url":"https://api.github.com/users/sjrd/gists{/gist_id}","starred_url":"https://api.github.com/users/sjrd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjrd/subscriptions","organizations_url":"https://api.github.com/users/sjrd/orgs","repos_url":"https://api.github.com/users/sjrd/repos","events_url":"https://api.github.com/users/sjrd/events{/privacy}","received_events_url":"https://api.github.com/users/sjrd/received_events","type":"User","site_admin":false},"body":"The returned list should be `Serializable`.\r\nAlso, I don't think `unmodifiableList` is needed.","created_at":"2015-06-15T12:01:46Z","updated_at":"2015-06-15T12:01:46Z","html_url":"https://github.com/scala-js/scala-js/pull/1720#discussion_r32412504","pull_request_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1720","_links":{"self":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/comments/32412504"},"html":{"href":"https://github.com/scala-js/scala-js/pull/1720#discussion_r32412504"},"pull_request":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1720"}}},"pull_request":{"url":"https://api.github.com/repos/scala-js/scala-js/pulls/1720","id":37672451,"html_url":"https://github.com/scala-js/scala-js/pull/1720","diff_url":"https://github.com/scala-js/scala-js/pull/1720.diff","patch_url":"https://github.com/scala-js/scala-js/pull/1720.patch","issue_url":"https://api.github.com/repos/scala-js/scala-js/issues/1720","number":1720,"state":"open","locked":false,"title":"Implement java.util.Collections","user":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"body":"Implemented `java.util.Collections` object.\r\nImplemented tests for each function in the object and each wrapped\r\ncollection.\r\nModified the testing infrastructure for `Collection` and `Map` to\r\nallow code reuse in `CollectionsTest`.\r\n","created_at":"2015-06-15T09:23:31Z","updated_at":"2015-06-15T12:01:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"553170eae30f4df2944b7d8eacc379ef5a0cb03a","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1720/commits","review_comments_url":"https://api.github.com/repos/scala-js/scala-js/pulls/1720/comments","review_comment_url":"https://api.github.com/repos/scala-js/scala-js/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scala-js/scala-js/issues/1720/comments","statuses_url":"https://api.github.com/repos/scala-js/scala-js/statuses/75b499e057249ac56ea2f46fd902a10a330592f8","head":{"label":"nicolasstucki:java-collections-implementation","ref":"java-collections-implementation","sha":"75b499e057249ac56ea2f46fd902a10a330592f8","user":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"repo":{"id":35167756,"name":"scala-js","full_name":"nicolasstucki/scala-js","owner":{"login":"nicolasstucki","id":3648029,"avatar_url":"https://avatars.githubusercontent.com/u/3648029?v=3","gravatar_id":"","url":"https://api.github.com/users/nicolasstucki","html_url":"https://github.com/nicolasstucki","followers_url":"https://api.github.com/users/nicolasstucki/followers","following_url":"https://api.github.com/users/nicolasstucki/following{/other_user}","gists_url":"https://api.github.com/users/nicolasstucki/gists{/gist_id}","starred_url":"https://api.github.com/users/nicolasstucki/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nicolasstucki/subscriptions","organizations_url":"https://api.github.com/users/nicolasstucki/orgs","repos_url":"https://api.github.com/users/nicolasstucki/repos","events_url":"https://api.github.com/users/nicolasstucki/events{/privacy}","received_events_url":"https://api.github.com/users/nicolasstucki/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/nicolasstucki/scala-js","description":"Scala.js, the Scala to JavaScript compiler","fork":true,"url":"https://api.github.com/repos/nicolasstucki/scala-js","forks_url":"https://api.github.com/repos/nicolasstucki/scala-js/forks","keys_url":"https://api.github.com/repos/nicolasstucki/scala-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nicolasstucki/scala-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nicolasstucki/scala-js/teams","hooks_url":"https://api.github.com/repos/nicolasstucki/scala-js/hooks","issue_events_url":"https://api.github.com/repos/nicolasstucki/scala-js/issues/events{/number}","events_url":"https://api.github.com/repos/nicolasstucki/scala-js/events","assignees_url":"https://api.github.com/repos/nicolasstucki/scala-js/assignees{/user}","branches_url":"https://api.github.com/repos/nicolasstucki/scala-js/branches{/branch}","tags_url":"https://api.github.com/repos/nicolasstucki/scala-js/tags","blobs_url":"https://api.github.com/repos/nicolasstucki/scala-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nicolasstucki/scala-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nicolasstucki/scala-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/nicolasstucki/scala-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nicolasstucki/scala-js/statuses/{sha}","languages_url":"https://api.github.com/repos/nicolasstucki/scala-js/languages","stargazers_url":"https://api.github.com/repos/nicolasstucki/scala-js/stargazers","contributors_url":"https://api.github.com/repos/nicolasstucki/scala-js/contributors","subscribers_url":"https://api.github.com/repos/nicolasstucki/scala-js/subscribers","subscription_url":"https://api.github.com/repos/nicolasstucki/scala-js/subscription","commits_url":"https://api.github.com/repos/nicolasstucki/scala-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/nicolasstucki/scala-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/nicolasstucki/scala-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/nicolasstucki/scala-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/nicolasstucki/scala-js/contents/{+path}","compare_url":"https://api.github.com/repos/nicolasstucki/scala-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nicolasstucki/scala-js/merges","archive_url":"https://api.github.com/repos/nicolasstucki/scala-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nicolasstucki/scala-js/downloads","issues_url":"https://api.github.com/repos/nicolasstucki/scala-js/issues{/number}","pulls_url":"https://api.github.com/repos/nicolasstucki/scala-js/pulls{/number}","milestones_url":"https://api.github.com/repos/nicolasstucki/scala-js/milestones{/number}","notifications_url":"https://api.github.com/repos/nicolasstucki/scala-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nicolasstucki/scala-js/labels{/name}","releases_url":"https://api.github.com/repos/nicolasstucki/scala-js/releases{/id}","created_at":"2015-05-06T15:41:56Z","updated_at":"2015-05-06T15:41:58Z","pushed_at":"2015-06-15T09:22:50Z","git_url":"git://github.com/nicolasstucki/scala-js.git","ssh_url":"git@github.com:nicolasstucki/scala-js.git","clone_url":"https://github.com/nicolasstucki/scala-js.git","svn_url":"https://github.com/nicolasstucki/scala-js","homepage":"http://www.scala-js.org/","size":8677,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"scala-js:master","ref":"master","sha":"276f4f2df9b3b1eb683a5c401c98c528b68cf6e2","user":{"login":"scala-js","id":6039724,"avatar_url":"https://avatars.githubusercontent.com/u/6039724?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-js","html_url":"https://github.com/scala-js","followers_url":"https://api.github.com/users/scala-js/followers","following_url":"https://api.github.com/users/scala-js/following{/other_user}","gists_url":"https://api.github.com/users/scala-js/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-js/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-js/subscriptions","organizations_url":"https://api.github.com/users/scala-js/orgs","repos_url":"https://api.github.com/users/scala-js/repos","events_url":"https://api.github.com/users/scala-js/events{/privacy}","received_events_url":"https://api.github.com/users/scala-js/received_events","type":"Organization","site_admin":false},"repo":{"id":8272315,"name":"scala-js","full_name":"scala-js/scala-js","owner":{"login":"scala-js","id":6039724,"avatar_url":"https://avatars.githubusercontent.com/u/6039724?v=3","gravatar_id":"","url":"https://api.github.com/users/scala-js","html_url":"https://github.com/scala-js","followers_url":"https://api.github.com/users/scala-js/followers","following_url":"https://api.github.com/users/scala-js/following{/other_user}","gists_url":"https://api.github.com/users/scala-js/gists{/gist_id}","starred_url":"https://api.github.com/users/scala-js/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scala-js/subscriptions","organizations_url":"https://api.github.com/users/scala-js/orgs","repos_url":"https://api.github.com/users/scala-js/repos","events_url":"https://api.github.com/users/scala-js/events{/privacy}","received_events_url":"https://api.github.com/users/scala-js/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/scala-js/scala-js","description":"Scala.js, the Scala to JavaScript compiler","fork":false,"url":"https://api.github.com/repos/scala-js/scala-js","forks_url":"https://api.github.com/repos/scala-js/scala-js/forks","keys_url":"https://api.github.com/repos/scala-js/scala-js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scala-js/scala-js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scala-js/scala-js/teams","hooks_url":"https://api.github.com/repos/scala-js/scala-js/hooks","issue_events_url":"https://api.github.com/repos/scala-js/scala-js/issues/events{/number}","events_url":"https://api.github.com/repos/scala-js/scala-js/events","assignees_url":"https://api.github.com/repos/scala-js/scala-js/assignees{/user}","branches_url":"https://api.github.com/repos/scala-js/scala-js/branches{/branch}","tags_url":"https://api.github.com/repos/scala-js/scala-js/tags","blobs_url":"https://api.github.com/repos/scala-js/scala-js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scala-js/scala-js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scala-js/scala-js/git/refs{/sha}","trees_url":"https://api.github.com/repos/scala-js/scala-js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scala-js/scala-js/statuses/{sha}","languages_url":"https://api.github.com/repos/scala-js/scala-js/languages","stargazers_url":"https://api.github.com/repos/scala-js/scala-js/stargazers","contributors_url":"https://api.github.com/repos/scala-js/scala-js/contributors","subscribers_url":"https://api.github.com/repos/scala-js/scala-js/subscribers","subscription_url":"https://api.github.com/repos/scala-js/scala-js/subscription","commits_url":"https://api.github.com/repos/scala-js/scala-js/commits{/sha}","git_commits_url":"https://api.github.com/repos/scala-js/scala-js/git/commits{/sha}","comments_url":"https://api.github.com/repos/scala-js/scala-js/comments{/number}","issue_comment_url":"https://api.github.com/repos/scala-js/scala-js/issues/comments{/number}","contents_url":"https://api.github.com/repos/scala-js/scala-js/contents/{+path}","compare_url":"https://api.github.com/repos/scala-js/scala-js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scala-js/scala-js/merges","archive_url":"https://api.github.com/repos/scala-js/scala-js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scala-js/scala-js/downloads","issues_url":"https://api.github.com/repos/scala-js/scala-js/issues{/number}","pulls_url":"https://api.github.com/repos/scala-js/scala-js/pulls{/number}","milestones_url":"https://api.github.com/repos/scala-js/scala-js/milestones{/number}","notifications_url":"https://api.github.com/repos/scala-js/scala-js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scala-js/scala-js/labels{/name}","releases_url":"https://api.github.com/repos/scala-js/scala-js/releases{/id}","created_at":"2013-02-18T16:33:55Z","updated_at":"2015-06-15T03:35:46Z","pushed_at":"2015-06-15T09:23:32Z","git_url":"git://github.com/scala-js/scala-js.git","ssh_url":"git@github.com:scala-js/scala-js.git","clone_url":"https://github.com/scala-js/scala-js.git","svn_url":"https://github.com/scala-js/scala-js","homepage":"http://www.scala-js.org/","size":15888,"stargazers_count":1715,"watchers_count":1715,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":146,"mirror_url":null,"open_issues_count":55,"forks":146,"open_issues":55,"watchers":1715,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1720"},"html":{"href":"https://github.com/scala-js/scala-js/pull/1720"},"issue":{"href":"https://api.github.com/repos/scala-js/scala-js/issues/1720"},"comments":{"href":"https://api.github.com/repos/scala-js/scala-js/issues/1720/comments"},"review_comments":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1720/comments"},"review_comment":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scala-js/scala-js/pulls/1720/commits"},"statuses":{"href":"https://api.github.com/repos/scala-js/scala-js/statuses/75b499e057249ac56ea2f46fd902a10a330592f8"}}}}