{"action":"created","comment":{"url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/comments/206870368","pull_request_review_id":142365534,"id":206870368,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNjg3MDM2OA==","diff_hunk":"@@ -12,138 +12,204 @@ import scala.util.control.NonFatal\n private[fs2] sealed abstract class FreeC[F[_], +R] {\n \n   def flatMap[R2](f: R => FreeC[F, R2]): FreeC[F, R2] =\n-    Bind[F, R, R2](this,\n-                   e =>\n-                     e match {\n-                       case Right(r) =>\n-                         try f(r)\n-                         catch { case NonFatal(e) => FreeC.Fail(e) }\n-                       case Left(e) => FreeC.Fail(e)\n-                   })\n-\n-  def transformWith[R2](f: Either[Throwable, R] => FreeC[F, R2]): FreeC[F, R2] =\n+    Bind[F, R, R2](\n+      this,\n+      e =>\n+        e match {\n+          case Result.Pure(r) =>\n+            try f(r)\n+            catch { case NonFatal(e) => FreeC.Result.Fail(e) }\n+          case Result.Interrupted(scope, err) => FreeC.Result.Interrupted(scope, err)\n+          case Result.Fail(e)                 => FreeC.Result.Fail(e)\n+      }\n+    )\n+\n+  def transformWith[R2](f: Result[R] => FreeC[F, R2]): FreeC[F, R2] =\n     Bind[F, R, R2](this,\n                    r =>\n                      try f(r)\n-                     catch { case NonFatal(e) => FreeC.Fail(e) })\n+                     catch { case NonFatal(e) => FreeC.Result.Fail(e) })\n \n   def map[R2](f: R => R2): FreeC[F, R2] =\n-    Bind(this,\n-         (r: Either[Throwable, R]) =>\n-           r match {\n-             case Right(r) =>\n-               try FreeC.Pure(f(r))\n-               catch { case NonFatal(e) => FreeC.Fail(e) }\n-             case Left(e) => FreeC.Fail(e)\n-         })\n+    Bind[F, R, R2](this, _.map(f).asFreeC[F])\n \n   def handleErrorWith[R2 >: R](h: Throwable => FreeC[F, R2]): FreeC[F, R2] =\n     Bind[F, R2, R2](this,\n                     e =>\n                       e match {\n-                        case Right(a) => FreeC.Pure(a)\n-                        case Left(e) =>\n+                        case Result.Fail(e) =>\n                           try h(e)\n-                          catch { case NonFatal(e) => FreeC.Fail(e) }\n+                          catch { case NonFatal(e) => FreeC.Result.Fail(e) }\n+                        case other => other.covary[R2].asFreeC[F]\n                     })\n \n   def asHandler(e: Throwable): FreeC[F, R] = viewL.get match {\n-    case Pure(_)    => Fail(e)\n-    case Fail(e2)   => Fail(e)\n-    case Bind(_, k) => k(Left(e))\n+    case Result.Pure(_)  => Result.Fail(e)\n+    case Result.Fail(e2) => Result.Fail(CompositeFailure(e2, e))\n+    case Result.Interrupted(scope, err) =>\n+      Result.Interrupted(scope, err.map(t => CompositeFailure(e, t)).orElse(Some(e)))\n+    case Bind(_, k) => k(Result.Fail(e))\n     case Eval(_)    => sys.error(\"impossible\")\n   }\n \n   def viewL: ViewL[F, R] = mkViewL(this)\n \n   def translate[G[_]](f: F ~> G): FreeC[G, R] = FreeC.suspend {\n     viewL.get match {\n-      case Pure(r) => Pure(r)\n       case Bind(fx, k) =>\n-        Bind(fx.translate(f), (e: Either[Throwable, Any]) => k(e).translate(f))\n-      case Fail(e)  => Fail(e)\n-      case Eval(fx) => sys.error(\"impossible\")\n+        Bind(fx.translate(f), (e: Result[Any]) => k(e).translate(f))\n+      case Eval(fx)  => sys.error(\"impossible\")\n+      case Result(r) => r.asFreeC[G]\n     }\n   }\n }\n \n private[fs2] object FreeC {\n-  final case class Pure[F[_], R](r: R) extends FreeC[F, R] {\n-    override def translate[G[_]](f: F ~> G): FreeC[G, R] =\n-      this.asInstanceOf[FreeC[G, R]]\n-    override def toString: String = s\"FreeC.Pure($r)\"\n+\n+  def pure[F[_], A](a: A): FreeC[F, A] = Result.Pure(a)\n+\n+  def eval[F[_], A](f: F[A]): FreeC[F, A] = Eval(f)\n+\n+  def raiseError[F[_], A](rsn: Throwable): FreeC[F, A] = Result.Fail(rsn)\n+\n+  def interrupted[F[_], A](scopeId: Token, failure: Option[Throwable]): FreeC[F, A] =\n+    Result.Interrupted(scopeId, failure)\n+\n+  sealed trait Result[+R] { self =>\n+\n+    def asFreeC[F[_]]: FreeC[F, R] = self.asInstanceOf[FreeC[F, R]]\n+\n+    def asExitCase: ExitCase[Throwable] = self match {\n+      case Result.Pure(_)           => ExitCase.Completed\n+      case Result.Fail(err)         => ExitCase.Error(err)\n+      case Result.Interrupted(_, _) => ExitCase.Canceled\n+    }\n+\n+    def covary[R2 >: R]: Result[R2] = self.asInstanceOf[Result[R2]]\n+\n+    def recoverWith[R2 >: R](f: Throwable => Result[R2]): Result[R2] = self match {\n+      case Result.Fail(err) =>\n+        try { f(err) } catch { case NonFatal(err2) => Result.Fail(CompositeFailure(err, err2)) }\n+      case _ => covary[R2]\n+    }\n+\n+  }\n+\n+  object Result {\n+\n+    val unit: Result[Unit] = pure(())\n+\n+    def pure[A](a: A): Result[A] = Result.Pure(a)\n+\n+    def raiseError[A](rsn: Throwable): Result[A] = Result.Fail(rsn)\n+\n+    def interrupted[A](scopeId: Token, failure: Option[Throwable]): Result[A] =\n+      Result.Interrupted(scopeId, failure)\n+\n+    def fromEither[F[_], R](either: Either[Throwable, R]): Result[R] =\n+      either.fold(Result.Fail(_), Result.Pure(_))\n+\n+    def unapply[F[_], R](freeC: FreeC[F, R]): Option[Result[R]] = freeC match {\n+      case r @ Result.Pure(_)           => Some(r: Result[R])\n+      case r @ Result.Fail(_)           => Some(r: Result[R])\n+      case r @ Result.Interrupted(_, _) => Some(r: Result[R])\n+      case _                            => None\n+    }\n+\n+    final case class Pure[F[_], R](r: R) extends FreeC[F, R] with Result[R] {\n+      override def translate[G[_]](f: F ~> G): FreeC[G, R] =\n+        this.asInstanceOf[FreeC[G, R]]\n+      override def toString: String = s\"FreeC.Pure($r)\"\n+    }\n+\n+    final case class Fail[F[_], R](error: Throwable) extends FreeC[F, R] with Result[R] {\n+      override def translate[G[_]](f: F ~> G): FreeC[G, R] =\n+        this.asInstanceOf[FreeC[G, R]]\n+      override def toString: String = s\"FreeC.Fail($error)\"\n+    }\n+\n+    // finalizerErrors contains accumulated errors during finalization of interruption.\n+    // they will be presented to freeC after interupted scope will be closed\n+    final case class Interrupted[F[_], R](scope: Token, finalizerErrors: Option[Throwable])\n+        extends FreeC[F, R]\n+        with Result[R] {\n+      override def translate[G[_]](f: F ~> G): FreeC[G, R] =\n+        this.asInstanceOf[FreeC[G, R]]\n+      override def toString: String = s\"FreeC.Interrupted($scope, ${})\"\n+    }\n+\n+    implicit class ResultSyntax[R](val self: Result[R]) extends AnyVal {\n+\n+      def map[R2](f: R => R2): Result[R2] = self match {","path":"core/shared/src/main/scala/fs2/internal/FreeC.scala","position":184,"original_position":165,"commit_id":"4d62532384abdc8fda79f727a200178843bd19b9","original_commit_id":"91ec8364db2f737a5873e38047e571e6dea222b2","user":{"login":"mpilquist","id":118078,"node_id":"MDQ6VXNlcjExODA3OA==","avatar_url":"https://avatars2.githubusercontent.com/u/118078?v=4","gravatar_id":"","url":"https://api.github.com/users/mpilquist","html_url":"https://github.com/mpilquist","followers_url":"https://api.github.com/users/mpilquist/followers","following_url":"https://api.github.com/users/mpilquist/following{/other_user}","gists_url":"https://api.github.com/users/mpilquist/gists{/gist_id}","starred_url":"https://api.github.com/users/mpilquist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mpilquist/subscriptions","organizations_url":"https://api.github.com/users/mpilquist/orgs","repos_url":"https://api.github.com/users/mpilquist/repos","events_url":"https://api.github.com/users/mpilquist/events{/privacy}","received_events_url":"https://api.github.com/users/mpilquist/received_events","type":"User","site_admin":false},"body":"Ah yes, okay I understand. We could fix by making `FreeC` covariant in both type params and making `Result[A] <: FreeC[Nothing, A]` but that's a lot of annoying machinery.\r\n\r\nHow about we rename `map` on `Result` to something else? `mapR` or something?","created_at":"2018-08-01T13:06:51Z","updated_at":"2018-08-01T13:06:51Z","html_url":"https://github.com/functional-streams-for-scala/fs2/pull/1197#discussion_r206870368","pull_request_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/comments/206870368"},"html":{"href":"https://github.com/functional-streams-for-scala/fs2/pull/1197#discussion_r206870368"},"pull_request":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197"}},"in_reply_to_id":206584095},"pull_request":{"url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197","id":205145036,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1MTQ1MDM2","html_url":"https://github.com/functional-streams-for-scala/fs2/pull/1197","diff_url":"https://github.com/functional-streams-for-scala/fs2/pull/1197.diff","patch_url":"https://github.com/functional-streams-for-scala/fs2/pull/1197.patch","issue_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/1197","number":1197,"state":"open","locked":false,"title":"Bugfix/interrupt fold","user":{"login":"pchlupacek","id":678560,"node_id":"MDQ6VXNlcjY3ODU2MA==","avatar_url":"https://avatars2.githubusercontent.com/u/678560?v=4","gravatar_id":"","url":"https://api.github.com/users/pchlupacek","html_url":"https://github.com/pchlupacek","followers_url":"https://api.github.com/users/pchlupacek/followers","following_url":"https://api.github.com/users/pchlupacek/following{/other_user}","gists_url":"https://api.github.com/users/pchlupacek/gists{/gist_id}","starred_url":"https://api.github.com/users/pchlupacek/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pchlupacek/subscriptions","organizations_url":"https://api.github.com/users/pchlupacek/orgs","repos_url":"https://api.github.com/users/pchlupacek/repos","events_url":"https://api.github.com/users/pchlupacek/events{/privacy}","received_events_url":"https://api.github.com/users/pchlupacek/received_events","type":"User","site_admin":false},"body":"@mpilquist @SystemFw \r\nThis fixes #1179 \r\nSome notable changes: \r\n\r\n- FreeC now have special case for stream evaluation being interrupted\r\n- FreeC now in `bind` takes `FreeC.Result` as argument, instead of Either. Result Type are pure cases of FreeC, so this also saves a bit on allocation\r\n- Interruption is now signalled via CompileScope, however no longer scope keeps the `case` to run when interrupted\r\n- Interpreter now does not have to `jump-off` in Uncons cases to open scope. Not only this makes it cleaner, but also it shall increase performance in certain scope-heavy interrupted streams. \r\n- Stream#flatMap has been simplified, which not only made code cleaner, but also leads to up to 70% speed increase in certain tests (See StreamPerformanceSpec)\r\n- I am not sure 100% about Pipe.Stepper and Pipe2.Stepper implementation. There are no tests whatsoever for these. I think we shall either write some, or perhaps remove Stepper. \r\n\r\n \r\n","created_at":"2018-07-31T15:05:13Z","updated_at":"2018-08-01T13:06:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f7741bf36cf11ade32270823aa9f67b10a23aa55","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197/commits","review_comments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197/comments","review_comment_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/1197/comments","statuses_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/statuses/4d62532384abdc8fda79f727a200178843bd19b9","head":{"label":"functional-streams-for-scala:bugfix/interrupt-fold","ref":"bugfix/interrupt-fold","sha":"4d62532384abdc8fda79f727a200178843bd19b9","user":{"login":"functional-streams-for-scala","id":14128107,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTI4MTA3","avatar_url":"https://avatars0.githubusercontent.com/u/14128107?v=4","gravatar_id":"","url":"https://api.github.com/users/functional-streams-for-scala","html_url":"https://github.com/functional-streams-for-scala","followers_url":"https://api.github.com/users/functional-streams-for-scala/followers","following_url":"https://api.github.com/users/functional-streams-for-scala/following{/other_user}","gists_url":"https://api.github.com/users/functional-streams-for-scala/gists{/gist_id}","starred_url":"https://api.github.com/users/functional-streams-for-scala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/functional-streams-for-scala/subscriptions","organizations_url":"https://api.github.com/users/functional-streams-for-scala/orgs","repos_url":"https://api.github.com/users/functional-streams-for-scala/repos","events_url":"https://api.github.com/users/functional-streams-for-scala/events{/privacy}","received_events_url":"https://api.github.com/users/functional-streams-for-scala/received_events","type":"Organization","site_admin":false},"repo":{"id":8609125,"node_id":"MDEwOlJlcG9zaXRvcnk4NjA5MTI1","name":"fs2","full_name":"functional-streams-for-scala/fs2","owner":{"login":"functional-streams-for-scala","id":14128107,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTI4MTA3","avatar_url":"https://avatars0.githubusercontent.com/u/14128107?v=4","gravatar_id":"","url":"https://api.github.com/users/functional-streams-for-scala","html_url":"https://github.com/functional-streams-for-scala","followers_url":"https://api.github.com/users/functional-streams-for-scala/followers","following_url":"https://api.github.com/users/functional-streams-for-scala/following{/other_user}","gists_url":"https://api.github.com/users/functional-streams-for-scala/gists{/gist_id}","starred_url":"https://api.github.com/users/functional-streams-for-scala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/functional-streams-for-scala/subscriptions","organizations_url":"https://api.github.com/users/functional-streams-for-scala/orgs","repos_url":"https://api.github.com/users/functional-streams-for-scala/repos","events_url":"https://api.github.com/users/functional-streams-for-scala/events{/privacy}","received_events_url":"https://api.github.com/users/functional-streams-for-scala/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/functional-streams-for-scala/fs2","description":"Compositional, streaming I/O library for Scala","fork":false,"url":"https://api.github.com/repos/functional-streams-for-scala/fs2","forks_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/forks","keys_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/teams","hooks_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/hooks","issue_events_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/events{/number}","events_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/events","assignees_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/assignees{/user}","branches_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/branches{/branch}","tags_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/tags","blobs_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/refs{/sha}","trees_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/statuses/{sha}","languages_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/languages","stargazers_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/stargazers","contributors_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/contributors","subscribers_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/subscribers","subscription_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/subscription","commits_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/commits{/sha}","git_commits_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/commits{/sha}","comments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/comments{/number}","issue_comment_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/comments{/number}","contents_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/contents/{+path}","compare_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/merges","archive_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/downloads","issues_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues{/number}","pulls_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls{/number}","milestones_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/milestones{/number}","notifications_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/labels{/name}","releases_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/releases{/id}","deployments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/deployments","created_at":"2013-03-06T17:34:15Z","updated_at":"2018-08-01T10:34:31Z","pushed_at":"2018-08-01T07:12:12Z","git_url":"git://github.com/functional-streams-for-scala/fs2.git","ssh_url":"git@github.com:functional-streams-for-scala/fs2.git","clone_url":"https://github.com/functional-streams-for-scala/fs2.git","svn_url":"https://github.com/functional-streams-for-scala/fs2","homepage":"https://functional-streams-for-scala.github.io/fs2/","size":7701,"stargazers_count":1145,"watchers_count":1145,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":293,"mirror_url":null,"archived":false,"open_issues_count":37,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":293,"open_issues":37,"watchers":1145,"default_branch":"series/1.0"}},"base":{"label":"functional-streams-for-scala:series/1.0","ref":"series/1.0","sha":"f353d2d9b645e2c0495bbe8f28aba52151b648bc","user":{"login":"functional-streams-for-scala","id":14128107,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTI4MTA3","avatar_url":"https://avatars0.githubusercontent.com/u/14128107?v=4","gravatar_id":"","url":"https://api.github.com/users/functional-streams-for-scala","html_url":"https://github.com/functional-streams-for-scala","followers_url":"https://api.github.com/users/functional-streams-for-scala/followers","following_url":"https://api.github.com/users/functional-streams-for-scala/following{/other_user}","gists_url":"https://api.github.com/users/functional-streams-for-scala/gists{/gist_id}","starred_url":"https://api.github.com/users/functional-streams-for-scala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/functional-streams-for-scala/subscriptions","organizations_url":"https://api.github.com/users/functional-streams-for-scala/orgs","repos_url":"https://api.github.com/users/functional-streams-for-scala/repos","events_url":"https://api.github.com/users/functional-streams-for-scala/events{/privacy}","received_events_url":"https://api.github.com/users/functional-streams-for-scala/received_events","type":"Organization","site_admin":false},"repo":{"id":8609125,"node_id":"MDEwOlJlcG9zaXRvcnk4NjA5MTI1","name":"fs2","full_name":"functional-streams-for-scala/fs2","owner":{"login":"functional-streams-for-scala","id":14128107,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE0MTI4MTA3","avatar_url":"https://avatars0.githubusercontent.com/u/14128107?v=4","gravatar_id":"","url":"https://api.github.com/users/functional-streams-for-scala","html_url":"https://github.com/functional-streams-for-scala","followers_url":"https://api.github.com/users/functional-streams-for-scala/followers","following_url":"https://api.github.com/users/functional-streams-for-scala/following{/other_user}","gists_url":"https://api.github.com/users/functional-streams-for-scala/gists{/gist_id}","starred_url":"https://api.github.com/users/functional-streams-for-scala/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/functional-streams-for-scala/subscriptions","organizations_url":"https://api.github.com/users/functional-streams-for-scala/orgs","repos_url":"https://api.github.com/users/functional-streams-for-scala/repos","events_url":"https://api.github.com/users/functional-streams-for-scala/events{/privacy}","received_events_url":"https://api.github.com/users/functional-streams-for-scala/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/functional-streams-for-scala/fs2","description":"Compositional, streaming I/O library for Scala","fork":false,"url":"https://api.github.com/repos/functional-streams-for-scala/fs2","forks_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/forks","keys_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/teams","hooks_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/hooks","issue_events_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/events{/number}","events_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/events","assignees_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/assignees{/user}","branches_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/branches{/branch}","tags_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/tags","blobs_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/refs{/sha}","trees_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/statuses/{sha}","languages_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/languages","stargazers_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/stargazers","contributors_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/contributors","subscribers_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/subscribers","subscription_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/subscription","commits_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/commits{/sha}","git_commits_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/git/commits{/sha}","comments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/comments{/number}","issue_comment_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/comments{/number}","contents_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/contents/{+path}","compare_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/merges","archive_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/downloads","issues_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues{/number}","pulls_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls{/number}","milestones_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/milestones{/number}","notifications_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/labels{/name}","releases_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/releases{/id}","deployments_url":"https://api.github.com/repos/functional-streams-for-scala/fs2/deployments","created_at":"2013-03-06T17:34:15Z","updated_at":"2018-08-01T10:34:31Z","pushed_at":"2018-08-01T07:12:12Z","git_url":"git://github.com/functional-streams-for-scala/fs2.git","ssh_url":"git@github.com:functional-streams-for-scala/fs2.git","clone_url":"https://github.com/functional-streams-for-scala/fs2.git","svn_url":"https://github.com/functional-streams-for-scala/fs2","homepage":"https://functional-streams-for-scala.github.io/fs2/","size":7701,"stargazers_count":1145,"watchers_count":1145,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":293,"mirror_url":null,"archived":false,"open_issues_count":37,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":293,"open_issues":37,"watchers":1145,"default_branch":"series/1.0"}},"_links":{"self":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197"},"html":{"href":"https://github.com/functional-streams-for-scala/fs2/pull/1197"},"issue":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/1197"},"comments":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/issues/1197/comments"},"review_comments":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197/comments"},"review_comment":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/pulls/1197/commits"},"statuses":{"href":"https://api.github.com/repos/functional-streams-for-scala/fs2/statuses/4d62532384abdc8fda79f727a200178843bd19b9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mpilquist"}}