{"action":"created","comment":{"url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/comments/238793163","pull_request_review_id":181422961,"id":238793163,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzODc5MzE2Mw==","diff_hunk":"@@ -0,0 +1,874 @@\n+package scalaz.zio.stream\n+\n+import scalaz.zio._\n+\n+import scala.reflect._\n+\n+/**\n+ * A `Chunk[A]` represents a chunk of values of type `A`. Chunks are designed\n+ * are usually backed by arrays, but expose a purely functional, safe interface\n+ * to the underlying elements, and they become lazy on operations that would be\n+ * costly with arrays, such as repeated concatenation.\n+ */\n+sealed trait Chunk[@specialized +A] { self =>\n+\n+  /**\n+   * The number of elements in the chunk.\n+   */\n+  def length: Int\n+\n+  /**\n+   * Determines if the chunk is empty.\n+   */\n+  final def isEmpty: Boolean = length == 0\n+\n+  /**\n+   * Determines if the chunk is not empty.\n+   */\n+  final def notEmpty: Boolean = length > 0\n+\n+  /**\n+   * Returns the concatenation of this chunk with the specified chunk.\n+   */\n+  final def ++[A1 >: A](that: Chunk[A1]): Chunk[A1] =\n+    if (self.length == 0) that\n+    else if (that.length == 0) self\n+    else Chunk.Concat(self, that)\n+\n+  /**\n+   * Returns a filtered, mapped subset of the elements of this chunk.\n+   */\n+  def collect[@specialized B](p: PartialFunction[A, B]): Chunk[B] =\n+    self.materialize.collect(p)\n+\n+  /**\n+   * Drops the first `n` elements of the chunk.\n+   */\n+  final def drop(n: Int): Chunk[A] =\n+    if (n <= 0) self\n+    else\n+      self match {\n+        case Chunk.Slice(c, o, l)        => Chunk.Slice(c, o + n, l - n)\n+        case Chunk.Singleton(_) if n > 0 => Chunk.empty\n+        case c @ Chunk.Singleton(_)      => c\n+        case Chunk.Empty                 => Chunk.empty\n+        case _                           => Chunk.Slice(self, n, self.length - n)\n+      }\n+\n+  /**\n+   * Drops all elements so long as the predicate returns true.\n+   */\n+  def dropWhile(f: A => Boolean): Chunk[A] = {\n+    val len = self.length\n+\n+    var i = 0\n+    while (i < len && f(self(i))) {\n+      i += 1\n+    }\n+\n+    if (i == len) Chunk.empty\n+    else if (i == 0) this\n+    else Chunk.Slice(self, i, len - i)\n+  }\n+\n+  override def equals(that: Any): Boolean = that match {\n+    case that: Chunk[_] =>\n+      if (self.length != that.length) false\n+      else {\n+        var i     = 0\n+        var equal = true\n+        val len   = self.length\n+\n+        while (equal && i < len) {\n+          equal = self(i) == that(i)\n+          i += 1\n+        }\n+\n+        equal\n+      }\n+    case _ => false\n+  }\n+\n+  /**\n+   * Returns a filtered subset of this chunk.\n+   */\n+  def filter(f: A => Boolean): Chunk[A] = {\n+    implicit val B: ClassTag[A] = Chunk.classTagOf(this)\n+\n+    val len  = self.length\n+    val dest = Array.ofDim[A](len)\n+\n+    var i = 0\n+    var j = 0\n+    while (i < len) {\n+      val elem = self(i)\n+\n+      if (f(elem)) {\n+        dest(j) = elem\n+        j += 1\n+      }\n+\n+      i += 1\n+    }\n+\n+    if (j == 0) Chunk.Empty\n+    else Chunk.Slice(Chunk.Arr(dest), 0, j)\n+  }\n+\n+  /**\n+   * Returns the concatenation of mapping every element into a new chunk using\n+   * the specified function.\n+   */\n+  def flatMap[@specialized B](f: A => Chunk[B]): Chunk[B] = {\n+    val len                    = self.length\n+    var chunks: List[Chunk[B]] = Nil\n+\n+    var i               = 0\n+    var total           = 0\n+    var B0: ClassTag[B] = null.asInstanceOf[ClassTag[B]]\n+    while (i < len) {\n+      val chunk = f(self(i))\n+      if (chunk.length > 0) B0 = Chunk.classTagOf(chunk)\n+      chunks ::= chunk\n+      i += 1\n+      total += chunk.length\n+    }\n+    chunks = chunks.reverse\n+\n+    if (B0 == null) Chunk.empty\n+    else {\n+      implicit val B: ClassTag[B] = B0\n+\n+      val dest: Array[B] = Array.ofDim(total)\n+\n+      val it = chunks.iterator\n+      var n  = 0\n+      while (it.hasNext) {\n+        val chunk = it.next\n+\n+        chunk.toArray(n, dest)\n+        n += chunk.length\n+      }\n+\n+      Chunk.Arr(dest)\n+    }\n+  }\n+\n+  final def foldMLazy[E, S](z: S)(pred: S => Boolean)(f: (S, A) => IO[E, S]): IO[E, S] = {\n+    val len = length\n+\n+    def loop(s: S, i: Int): IO[E, S] =\n+      if (i >= len) IO.now(s)\n+      else {\n+        if (pred(s)) f(s, self(i)).flatMap(loop(_, i + 1))\n+        else IO.now(s)\n+      }\n+\n+    loop(z, 0)\n+  }\n+\n+  final def foldLeftLazy[S](z: S)(pred: S => Boolean)(f: (S, A) => S): S = {\n+    val len = length\n+    var s   = z\n+    var i   = 0\n+    while (i < len && pred(s)) {\n+      s = f(s, self(i))\n+      i += 1\n+    }\n+    s\n+  }\n+\n+  /**\n+   * Folds over the elements in this chunk from the left.\n+   */\n+  def foldLeft[@specialized S](s0: S)(f: (S, A) => S): S = {\n+    val len = self.length\n+    var s   = s0\n+\n+    var i = 0\n+    while (i < len) {\n+      s = f(s, self(i))\n+      i += 1\n+    }\n+\n+    s\n+  }\n+\n+  /**\n+   * Effectfully folds over the elements in this chunk from the left.\n+   */\n+  final def foldM[E, S](s: S)(f: (S, A) => IO[E, S]): IO[E, S] =\n+    foldLeft[IO[E, S]](IO.now(s)) { (s, a) =>\n+      s.flatMap(f(_, a))\n+    }\n+\n+  /**\n+   * Folds over the elements in this chunk from the right.\n+   */\n+  def foldRight[@specialized S](s0: S)(f: (A, S) => S): S = {\n+    val len = self.length\n+    var s   = s0\n+\n+    var i = len - 1\n+    while (i >= 0) {\n+      s = f(self(i), s)\n+      i -= 1\n+    }\n+\n+    s\n+  }\n+\n+  override final def hashCode: Int = toArray.toSeq.hashCode\n+\n+  /**\n+   * Returns a chunk with the elements mapped by the specified function.\n+   */\n+  def map[@specialized B](f: A => B): Chunk[B] = {\n+    val len  = self.length\n+    var dest = null.asInstanceOf[Array[B]]\n+\n+    var i = 0\n+    while (i < len) {\n+      val b = f(self(i))\n+\n+      if (dest == null) {\n+        implicit val B: ClassTag[B] = Chunk.Tags.fromValue(b)\n+\n+        dest = Array.ofDim[B](len)\n+      }\n+\n+      dest(i) = b\n+\n+      i = i + 1\n+    }\n+\n+    if (dest != null) Chunk.Arr(dest)\n+    else Chunk.Empty\n+  }\n+\n+  /**\n+   * Materializes a chunk into a chunk backed by an array. This method can\n+   * improve the performance of bulk operations.\n+   */\n+  def materialize[A1 >: A]: Chunk[A1] = Chunk.Arr(toArray)\n+\n+  /**\n+   * Generates a readable string representation of this chunk using the\n+   * specified start, separator, and end strings.\n+   */\n+  final def mkString(start: String, sep: String, end: String): String = {\n+    val builder = new scala.collection.mutable.StringBuilder()\n+\n+    builder.append(start)\n+\n+    var i   = 0\n+    val len = self.length\n+\n+    while (i < len) {\n+      if (i != 0) builder.append(sep)\n+      builder.append(self(i).toString)\n+      i += 1\n+    }\n+\n+    builder.append(end)\n+\n+    builder.toString\n+  }\n+\n+  /**\n+   * Generates a readable string representation of this chunk using the\n+   * specified separator string.\n+   */\n+  final def mkString(sep: String): String = mkString(\"\", sep, \"\")\n+\n+  /**\n+   * Generates a readable string representation of this chunk.\n+   */\n+  final def mkString: String = mkString(\"\")\n+\n+  /**\n+   * Scans over the chunk, statefully producing new elements of type `B`.\n+   */\n+  final def scan[@specialized S1, @specialized B](s1: S1)(f1: (S1, A) => (S1, B)): (S1, Chunk[B]) = {\n+    var s: S1          = s1\n+    var i              = 0\n+    var dest: Array[B] = null.asInstanceOf[Array[B]]\n+\n+    while (i < self.length) {\n+      val a = self(i)\n+      val t = f1(s, a)\n+\n+      s = t._1\n+      val b = t._2\n+\n+      if (dest == null) {\n+        implicit val B: ClassTag[B] = Chunk.Tags.fromValue(b)\n+\n+        dest = Array.ofDim(self.length)\n+      }\n+\n+      dest(i) = b\n+\n+      i += 1\n+    }\n+\n+    s ->\n+      (if (dest == null) Chunk.empty\n+       else Chunk.Arr(dest))\n+  }\n+\n+  /**\n+   * Takes the first `n` elements of the chunk.\n+   */\n+  final def take(n: Int): Chunk[A] =\n+    if (n <= 0) Chunk.Empty\n+    else if (n >= length) this\n+    else\n+      self match {\n+        case Chunk.Empty => Chunk.Empty\n+        case Chunk.Slice(c, o, l) =>\n+          if (n >= l) this\n+          else Chunk.Slice(c, o, n)\n+        case c @ Chunk.Singleton(_) => c\n+        case _                      => Chunk.Slice(self, 0, n)\n+      }\n+\n+  /**\n+   * Takes all elements so long as the predicate returns true.\n+   */\n+  def takeWhile(f: A => Boolean): Chunk[A] = {\n+    val len = self.length\n+\n+    var i = 0\n+    while (i < len && f(self(i))) {\n+      i += 1\n+    }\n+\n+    if (i == 0) Chunk.Empty\n+    else if (i == len) this\n+    else Chunk.Slice(this, 0, i)\n+  }\n+\n+  /**\n+   * Converts the chunk into an array.\n+   */\n+  def toArray[A1 >: A]: Array[A1] = {\n+    implicit val A1: ClassTag[A1] = Chunk.classTagOf(self)\n+\n+    val dest = Array.ofDim[A1](self.length)\n+\n+    self.toArray(0, dest)\n+\n+    dest\n+  }\n+\n+  def toSeq: Seq[A] = {\n+    val seqBuilder = Seq.newBuilder[A]\n+    var i          = 0\n+    val len        = length\n+    seqBuilder.sizeHint(len)\n+    while (i < len) {\n+      seqBuilder += apply(i)\n+      i += 1\n+    }\n+    seqBuilder.result()\n+  }\n+\n+  override def toString: String =\n+    toArray.mkString(s\"${self.getClass.getSimpleName}(\", \",\", \")\")\n+\n+  /**\n+   * Effectfully traverses the elements of this chunk.\n+   */\n+  final def traverse[E, B](f: A => IO[E, B]): IO[E, Chunk[B]] = {\n+    val len                    = self.length\n+    var array: IO[E, Array[B]] = IO.now(null.asInstanceOf[Array[B]])\n+    var i                      = 0\n+\n+    while (i < len) {\n+      array = array.seqWith(f(self.apply(i))) { (array, b) =>\n+        val array2 = if (array == null) {\n+          implicit val B: ClassTag[B] = Chunk.Tags.fromValue(b)\n+          Array.ofDim[B](len)\n+        } else array\n+\n+        array2(i) = b\n+        array2\n+      }\n+\n+      i += 1\n+    }\n+\n+    array.map(\n+      array =>\n+        if (array == null) Chunk.empty\n+        else Chunk.fromArray(array)\n+    )\n+  }\n+\n+  /**\n+   * Effectfully traverses the elements of this chunk purely for the effects.\n+   */\n+  final def traverse_[E](f: A => IO[E, Unit]): IO[E, Unit] = {\n+    val len             = self.length\n+    var io: IO[E, Unit] = IO.unit\n+    var i               = 0\n+\n+    while (i < len) {\n+      io = io *> f(self(i))\n+      i += 1\n+    }\n+\n+    io\n+  }\n+\n+  /**\n+   * Returns two splits of this chunk at the specified index.\n+   */\n+  final def splitAt(n: Int): (Chunk[A], Chunk[A]) =\n+    (take(n), drop(n))\n+\n+  /**\n+   * Zips this chunk with the specified chunk using the specified combiner.\n+   */\n+  final def zipWith[@specialized B, @specialized C](that: Chunk[B])(f: (A, B) => C): Chunk[C] = {\n+    val size = self.length.min(that.length)\n+\n+    if (size == 0) Chunk.empty\n+    else {\n+      var dest = null.asInstanceOf[Array[C]]","path":"core/shared/src/main/scala/scalaz/zio/stream/Chunk.scala","position":439,"original_position":439,"commit_id":"854a4d3b9aef7bcd7f28fe5c62a2457eaf6a795f","original_commit_id":"ac84795ea19bdd16504d89799e52aa478a0c37cf","user":{"login":"iravid","id":283332,"node_id":"MDQ6VXNlcjI4MzMzMg==","avatar_url":"https://avatars2.githubusercontent.com/u/283332?v=4","gravatar_id":"","url":"https://api.github.com/users/iravid","html_url":"https://github.com/iravid","followers_url":"https://api.github.com/users/iravid/followers","following_url":"https://api.github.com/users/iravid/following{/other_user}","gists_url":"https://api.github.com/users/iravid/gists{/gist_id}","starred_url":"https://api.github.com/users/iravid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iravid/subscriptions","organizations_url":"https://api.github.com/users/iravid/orgs","repos_url":"https://api.github.com/users/iravid/repos","events_url":"https://api.github.com/users/iravid/events{/privacy}","received_events_url":"https://api.github.com/users/iravid/received_events","type":"User","site_admin":false},"body":"Well, the problem is that you need the first element to allocate the array, as you need the classtag. This means we need to replicate the loop logic for the first element, which I'm not sure is a big win in terms of performance and maintainability.\r\n\r\nLet's leave this to benchmarking and later PRs?","created_at":"2018-12-04T18:54:59Z","updated_at":"2018-12-04T18:55:00Z","html_url":"https://github.com/scalaz/scalaz-zio/pull/374#discussion_r238793163","pull_request_url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/comments/238793163"},"html":{"href":"https://github.com/scalaz/scalaz-zio/pull/374#discussion_r238793163"},"pull_request":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374"}},"in_reply_to_id":238588605},"pull_request":{"url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374","id":231677347,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMxNjc3MzQ3","html_url":"https://github.com/scalaz/scalaz-zio/pull/374","diff_url":"https://github.com/scalaz/scalaz-zio/pull/374.diff","patch_url":"https://github.com/scalaz/scalaz-zio/pull/374.patch","issue_url":"https://api.github.com/repos/scalaz/scalaz-zio/issues/374","number":374,"state":"open","locked":false,"title":"Add Scalaz Stream","user":{"login":"iravid","id":283332,"node_id":"MDQ6VXNlcjI4MzMzMg==","avatar_url":"https://avatars2.githubusercontent.com/u/283332?v=4","gravatar_id":"","url":"https://api.github.com/users/iravid","html_url":"https://github.com/iravid","followers_url":"https://api.github.com/users/iravid/followers","following_url":"https://api.github.com/users/iravid/following{/other_user}","gists_url":"https://api.github.com/users/iravid/gists{/gist_id}","starred_url":"https://api.github.com/users/iravid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iravid/subscriptions","organizations_url":"https://api.github.com/users/iravid/orgs","repos_url":"https://api.github.com/users/iravid/repos","events_url":"https://api.github.com/users/iravid/events{/privacy}","received_events_url":"https://api.github.com/users/iravid/received_events","type":"User","site_admin":false},"body":"This pull request contains a Work In Progress implementation of ZIO Stream. Designed as the successor of Scalaz Stream, ZIO Stream features a small API, rich composability, good type inference, clean integration with ZIO (including interruption, typed errors, concurrency, resource safety, and interoperability), good performance, and growing list of combinators.\r\n\r\nUnfinished work in this pull request:\r\n\r\n - [ ] Add comprehensive tests for Sink\r\n - [ ] Add comprehensive tests for Stream\r\n - [ ] Add comprehensive tests for StreamChunk\r\n - [ ] Add comprehensive tests for hybrid pure variations (pure sink, pure stream, pure stream chunk)\r\n - [ ] Propagate features like pure/pure fusion throughout all combinators\r\n - [ ] Add documentation in the microsite\r\n - [ ] Add additional combinators for common cases\r\n - [ ] Decide what to specialize and what not to specialize\r\n-  [ ] Add trampolining on Stream\r\n - [ ] Improve baseline performance (low-hanging fruit)\r\n - [ ] Hygiene issues such as alphabetizing, organizing public methods before private methods, and so forth\r\n\r\nWhile unfinished, the design is ready for feedback and public contributions! Thanks to all who inspired the design of this library, including Eric Torreborre (Beautiful Folds), Oleg Kiselyov (Iteratees), and the FS2 development team (Michael Pilquist, Fabio Labella, Pavel Chlupacek, and many others).\r\n","created_at":"2018-11-16T22:51:40Z","updated_at":"2018-12-04T18:55:00Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dd168a2fd39e3a87a1351847b34e88fa34178865","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374/commits","review_comments_url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374/comments","review_comment_url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/comments{/number}","comments_url":"https://api.github.com/repos/scalaz/scalaz-zio/issues/374/comments","statuses_url":"https://api.github.com/repos/scalaz/scalaz-zio/statuses/854a4d3b9aef7bcd7f28fe5c62a2457eaf6a795f","head":{"label":"iravid:scalaz-stream","ref":"scalaz-stream","sha":"854a4d3b9aef7bcd7f28fe5c62a2457eaf6a795f","user":{"login":"iravid","id":283332,"node_id":"MDQ6VXNlcjI4MzMzMg==","avatar_url":"https://avatars2.githubusercontent.com/u/283332?v=4","gravatar_id":"","url":"https://api.github.com/users/iravid","html_url":"https://github.com/iravid","followers_url":"https://api.github.com/users/iravid/followers","following_url":"https://api.github.com/users/iravid/following{/other_user}","gists_url":"https://api.github.com/users/iravid/gists{/gist_id}","starred_url":"https://api.github.com/users/iravid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iravid/subscriptions","organizations_url":"https://api.github.com/users/iravid/orgs","repos_url":"https://api.github.com/users/iravid/repos","events_url":"https://api.github.com/users/iravid/events{/privacy}","received_events_url":"https://api.github.com/users/iravid/received_events","type":"User","site_admin":false},"repo":{"id":148892955,"node_id":"MDEwOlJlcG9zaXRvcnkxNDg4OTI5NTU=","name":"scalaz-zio","full_name":"iravid/scalaz-zio","private":false,"owner":{"login":"iravid","id":283332,"node_id":"MDQ6VXNlcjI4MzMzMg==","avatar_url":"https://avatars2.githubusercontent.com/u/283332?v=4","gravatar_id":"","url":"https://api.github.com/users/iravid","html_url":"https://github.com/iravid","followers_url":"https://api.github.com/users/iravid/followers","following_url":"https://api.github.com/users/iravid/following{/other_user}","gists_url":"https://api.github.com/users/iravid/gists{/gist_id}","starred_url":"https://api.github.com/users/iravid/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iravid/subscriptions","organizations_url":"https://api.github.com/users/iravid/orgs","repos_url":"https://api.github.com/users/iravid/repos","events_url":"https://api.github.com/users/iravid/events{/privacy}","received_events_url":"https://api.github.com/users/iravid/received_events","type":"User","site_admin":false},"html_url":"https://github.com/iravid/scalaz-zio","description":"ZIO — A principled, powerful, standalone effect data type for any Scala project.","fork":true,"url":"https://api.github.com/repos/iravid/scalaz-zio","forks_url":"https://api.github.com/repos/iravid/scalaz-zio/forks","keys_url":"https://api.github.com/repos/iravid/scalaz-zio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/iravid/scalaz-zio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/iravid/scalaz-zio/teams","hooks_url":"https://api.github.com/repos/iravid/scalaz-zio/hooks","issue_events_url":"https://api.github.com/repos/iravid/scalaz-zio/issues/events{/number}","events_url":"https://api.github.com/repos/iravid/scalaz-zio/events","assignees_url":"https://api.github.com/repos/iravid/scalaz-zio/assignees{/user}","branches_url":"https://api.github.com/repos/iravid/scalaz-zio/branches{/branch}","tags_url":"https://api.github.com/repos/iravid/scalaz-zio/tags","blobs_url":"https://api.github.com/repos/iravid/scalaz-zio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/iravid/scalaz-zio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/iravid/scalaz-zio/git/refs{/sha}","trees_url":"https://api.github.com/repos/iravid/scalaz-zio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/iravid/scalaz-zio/statuses/{sha}","languages_url":"https://api.github.com/repos/iravid/scalaz-zio/languages","stargazers_url":"https://api.github.com/repos/iravid/scalaz-zio/stargazers","contributors_url":"https://api.github.com/repos/iravid/scalaz-zio/contributors","subscribers_url":"https://api.github.com/repos/iravid/scalaz-zio/subscribers","subscription_url":"https://api.github.com/repos/iravid/scalaz-zio/subscription","commits_url":"https://api.github.com/repos/iravid/scalaz-zio/commits{/sha}","git_commits_url":"https://api.github.com/repos/iravid/scalaz-zio/git/commits{/sha}","comments_url":"https://api.github.com/repos/iravid/scalaz-zio/comments{/number}","issue_comment_url":"https://api.github.com/repos/iravid/scalaz-zio/issues/comments{/number}","contents_url":"https://api.github.com/repos/iravid/scalaz-zio/contents/{+path}","compare_url":"https://api.github.com/repos/iravid/scalaz-zio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/iravid/scalaz-zio/merges","archive_url":"https://api.github.com/repos/iravid/scalaz-zio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/iravid/scalaz-zio/downloads","issues_url":"https://api.github.com/repos/iravid/scalaz-zio/issues{/number}","pulls_url":"https://api.github.com/repos/iravid/scalaz-zio/pulls{/number}","milestones_url":"https://api.github.com/repos/iravid/scalaz-zio/milestones{/number}","notifications_url":"https://api.github.com/repos/iravid/scalaz-zio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/iravid/scalaz-zio/labels{/name}","releases_url":"https://api.github.com/repos/iravid/scalaz-zio/releases{/id}","deployments_url":"https://api.github.com/repos/iravid/scalaz-zio/deployments","created_at":"2018-09-15T10:40:48Z","updated_at":"2018-11-16T20:40:37Z","pushed_at":"2018-12-04T18:27:45Z","git_url":"git://github.com/iravid/scalaz-zio.git","ssh_url":"git@github.com:iravid/scalaz-zio.git","clone_url":"https://github.com/iravid/scalaz-zio.git","svn_url":"https://github.com/iravid/scalaz-zio","homepage":"https://scalaz.github.io/scalaz-zio/","size":3053,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"scalaz:master","ref":"master","sha":"fe130a17c57a66a08157838b359d5b41e0c801c8","user":{"login":"scalaz","id":183416,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE4MzQxNg==","avatar_url":"https://avatars0.githubusercontent.com/u/183416?v=4","gravatar_id":"","url":"https://api.github.com/users/scalaz","html_url":"https://github.com/scalaz","followers_url":"https://api.github.com/users/scalaz/followers","following_url":"https://api.github.com/users/scalaz/following{/other_user}","gists_url":"https://api.github.com/users/scalaz/gists{/gist_id}","starred_url":"https://api.github.com/users/scalaz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalaz/subscriptions","organizations_url":"https://api.github.com/users/scalaz/orgs","repos_url":"https://api.github.com/users/scalaz/repos","events_url":"https://api.github.com/users/scalaz/events{/privacy}","received_events_url":"https://api.github.com/users/scalaz/received_events","type":"Organization","site_admin":false},"repo":{"id":134079884,"node_id":"MDEwOlJlcG9zaXRvcnkxMzQwNzk4ODQ=","name":"scalaz-zio","full_name":"scalaz/scalaz-zio","private":false,"owner":{"login":"scalaz","id":183416,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE4MzQxNg==","avatar_url":"https://avatars0.githubusercontent.com/u/183416?v=4","gravatar_id":"","url":"https://api.github.com/users/scalaz","html_url":"https://github.com/scalaz","followers_url":"https://api.github.com/users/scalaz/followers","following_url":"https://api.github.com/users/scalaz/following{/other_user}","gists_url":"https://api.github.com/users/scalaz/gists{/gist_id}","starred_url":"https://api.github.com/users/scalaz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scalaz/subscriptions","organizations_url":"https://api.github.com/users/scalaz/orgs","repos_url":"https://api.github.com/users/scalaz/repos","events_url":"https://api.github.com/users/scalaz/events{/privacy}","received_events_url":"https://api.github.com/users/scalaz/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/scalaz/scalaz-zio","description":"ZIO — Type-safe, composable concurrency for Scala","fork":false,"url":"https://api.github.com/repos/scalaz/scalaz-zio","forks_url":"https://api.github.com/repos/scalaz/scalaz-zio/forks","keys_url":"https://api.github.com/repos/scalaz/scalaz-zio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scalaz/scalaz-zio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scalaz/scalaz-zio/teams","hooks_url":"https://api.github.com/repos/scalaz/scalaz-zio/hooks","issue_events_url":"https://api.github.com/repos/scalaz/scalaz-zio/issues/events{/number}","events_url":"https://api.github.com/repos/scalaz/scalaz-zio/events","assignees_url":"https://api.github.com/repos/scalaz/scalaz-zio/assignees{/user}","branches_url":"https://api.github.com/repos/scalaz/scalaz-zio/branches{/branch}","tags_url":"https://api.github.com/repos/scalaz/scalaz-zio/tags","blobs_url":"https://api.github.com/repos/scalaz/scalaz-zio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scalaz/scalaz-zio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scalaz/scalaz-zio/git/refs{/sha}","trees_url":"https://api.github.com/repos/scalaz/scalaz-zio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scalaz/scalaz-zio/statuses/{sha}","languages_url":"https://api.github.com/repos/scalaz/scalaz-zio/languages","stargazers_url":"https://api.github.com/repos/scalaz/scalaz-zio/stargazers","contributors_url":"https://api.github.com/repos/scalaz/scalaz-zio/contributors","subscribers_url":"https://api.github.com/repos/scalaz/scalaz-zio/subscribers","subscription_url":"https://api.github.com/repos/scalaz/scalaz-zio/subscription","commits_url":"https://api.github.com/repos/scalaz/scalaz-zio/commits{/sha}","git_commits_url":"https://api.github.com/repos/scalaz/scalaz-zio/git/commits{/sha}","comments_url":"https://api.github.com/repos/scalaz/scalaz-zio/comments{/number}","issue_comment_url":"https://api.github.com/repos/scalaz/scalaz-zio/issues/comments{/number}","contents_url":"https://api.github.com/repos/scalaz/scalaz-zio/contents/{+path}","compare_url":"https://api.github.com/repos/scalaz/scalaz-zio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scalaz/scalaz-zio/merges","archive_url":"https://api.github.com/repos/scalaz/scalaz-zio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scalaz/scalaz-zio/downloads","issues_url":"https://api.github.com/repos/scalaz/scalaz-zio/issues{/number}","pulls_url":"https://api.github.com/repos/scalaz/scalaz-zio/pulls{/number}","milestones_url":"https://api.github.com/repos/scalaz/scalaz-zio/milestones{/number}","notifications_url":"https://api.github.com/repos/scalaz/scalaz-zio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scalaz/scalaz-zio/labels{/name}","releases_url":"https://api.github.com/repos/scalaz/scalaz-zio/releases{/id}","deployments_url":"https://api.github.com/repos/scalaz/scalaz-zio/deployments","created_at":"2018-05-19T16:40:37Z","updated_at":"2018-12-04T17:11:32Z","pushed_at":"2018-12-04T18:27:47Z","git_url":"git://github.com/scalaz/scalaz-zio.git","ssh_url":"git@github.com:scalaz/scalaz-zio.git","clone_url":"https://github.com/scalaz/scalaz-zio.git","svn_url":"https://github.com/scalaz/scalaz-zio","homepage":"https://scalaz.github.io/scalaz-zio/","size":3034,"stargazers_count":427,"watchers_count":427,"language":"Scala","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":130,"mirror_url":null,"archived":false,"open_issues_count":62,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":130,"open_issues":62,"watchers":427,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374"},"html":{"href":"https://github.com/scalaz/scalaz-zio/pull/374"},"issue":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/issues/374"},"comments":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/issues/374/comments"},"review_comments":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374/comments"},"review_comment":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/pulls/374/commits"},"statuses":{"href":"https://api.github.com/repos/scalaz/scalaz-zio/statuses/854a4d3b9aef7bcd7f28fe5c62a2457eaf6a795f"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"iravid"}}