{"action":"created","comment":{"url":"https://api.github.com/repos/non/cats/pulls/comments/23909529","id":23909529,"diff_hunk":"@@ -1,506 +1,124 @@\n package cats\n package data\n \n-import algebra.{Eq, Monoid, Order, Semigroup}\n+import Or.{LeftOr, RightOr}\n+import algebra.{Order, Monoid}\n \n-import scala.util.control.NonFatal\n-\n-/* Represents a disjunction: a result that is either an `A` or a `B`.\n+/** Represents a right-biased disjunction that is either an `A` or a `B`.\n  *\n- * An instance of `A` [[Or]] B is either a [[LOr]]`[A]` (aka a \"left\") or a [[ROr]]`[B]` (aka a \"right\").\n+ * An instance of `A` [[Or]] `B` is either a [[LeftOr]]`[A]` or a [[RightOr]]`[B]`.\n  *\n- * A common use of a disjunction is to explicitly represent the possibility of failure in a result as opposed to\n- * throwing an exception. By convention, the left is used for errors and the right is reserved for successes.\n+ * A common use of [[Or]] is to explicitly represent the possibility of failure in a result as opposed to\n+ * throwing an exception.  By convention, [[LeftOr]] is used for errors and [[RightOr]] is reserved for successes.\n  * For example, a function that attempts to parse an integer from a string may have a return type of\n  * `NumberFormatException` [[Or]] `Int`. However, since there is no need to actually throw an exception, the type (`A`)\n  * chosen for the \"left\" could be any type representing an error and has no need to actually extend `Exception`.\n  *\n  * `A` [[Or]] `B` is isomorphic to `scala.Either[A, B]`, but [[Or]] is right-biased, so methods such as `map` and\n  * `flatMap` apply only in the context of the \"right\" case. This right bias makes [[Or]] more convenient to use\n- * than `scala.Either` in a monadic context. Methods such as `swap`, `swapped`, and `leftMap` provide functionality\n+ * than `scala.Either` in a monadic context. Methods such as `swap`, and `leftMap` provide functionality\n  * that `scala.Either` exposes through left projections.\n  */\n-sealed abstract class Or[+A, +B] extends Product with Serializable {\n-  /*\n-  final class SwitchingOr[X](r: => X) {\n-    def <<?:(left: => X): X =\n-      Or.this match {\n-        case LOr(_) => left\n-        case ROr(_) => r\n-      }\n+sealed abstract class Or[+A, +B] {\n+  def fold[C](fa: A => C, fb: B => C): C = this match {\n+    case RightOr(b) => fb(b)\n+    case LeftOr(a) => fa(a)\n   }\n \n-  /** If this disjunction is right, return the given X value, otherwise, return the X value given to the return value. */\n-  def :?>>[X](right: => X): SwitchingOr[X] =\n-    new SwitchingOr[X](right)\n-  */\n-\n-  /** Return `true` if this disjunction is left. */\n-  def isLeft: Boolean =\n-    this match {\n-      case LOr(_) => true\n-      case ROr(_) => false\n-    }\n+  def isLeft = fold(_ => true, _ => false)\n \n-  /** Return `true` if this disjunction is right. */\n-  def isRight: Boolean =\n-    this match {\n-      case LOr(_) => false\n-      case ROr(_) => true\n-    }\n+  def isRight = fold(_ => false, _ => true)\n \n-  /** Catamorphism. Run the first given function if left, otherwise, the second given function. */\n-  def fold[X](l: A => X, r: B => X): X =\n-    this match {\n-      case LOr(a) => l(a)\n-      case ROr(b) => r(b)\n-    }\n+  def swap: B Or A = fold(RightOr(_), LeftOr(_))\n \n-  /** Spin in tail-position on the right value of this disjunction. */\n-  def loopr[AA >: A, BB >: B, X](left: AA => X, right: BB => X Or (AA Or BB)): X =\n-    Or.loopRight(this, left, right)\n+  def foreach(f: B => Unit): Unit = fold(_ => (), f(_))\n \n-  /** Spin in tail-position on the left value of this disjunction. */\n-  def loopl[AA >: A, BB >: B, X](left: AA => X Or (AA Or BB), right: BB => X): X =\n-    Or.loopLeft(this, left, right)\n+  def getOrElse[BB >: B](default: => BB): BB = fold(_ => default, identity)\n \n-  /** Flip the left/right values in this disjunction. Alias for `unary_~` */\n-  def swap: (B Or A) =\n-    this match {\n-      case LOr(a) => ROr(a)\n-      case ROr(b) => LOr(b)\n-    }\n+  def forall(f: B => Boolean) = fold(_ => true, f)\n \n-  /** Flip the left/right values in this disjunction. Alias for `swap` */\n-  def unary_~ : (B Or A) =\n-    swap\n+  def exists(f: B => Boolean) = fold(_ => false, f)\n \n-  /** Run the given function on this swapped value. Alias for `~` */\n-  def swapped[AA, BB](k: (B Or A) => (BB Or AA)): (AA Or BB) =\n-    k(swap).swap\n+  def filter[AA >: A](f: B => Boolean)(implicit M: Monoid[AA]): AA Or B = fold(\n+    _ => this,\n+    b => if (f(b)) this else LeftOr(M.empty)\n+  )\n \n-  /** Run the given function on this swapped value. Alias for `swapped` */\n-  def ~[AA, BB](k: (B Or A) => (BB Or AA)): (AA Or BB) =\n-    swapped(k)\n+  def to[F[_], BB >: B](implicit monoidKF: MonoidK[F], applicativeF: Applicative[F]): F[BB] =\n+    fold(_ => monoidKF.empty, applicativeF.pure)\n \n-  /** Binary functor map on this disjunction. */\n-  def bimap[C, D](f: A => C, g: B => D): (C Or D) =\n-    this match {\n-      case LOr(a) => LOr(f(a))\n-      case ROr(b) => ROr(g(b))\n-    }\n-\n-  /** Run the given function on the left value. */\n-  def leftMap[C](f: A => C): (C Or B) =\n-    this match {\n-      case LOr(a) => LOr(f(a))\n-      case b @ ROr(_) => b\n-    }\n-\n-  /** Binary functor traverse on this disjunction. */\n-  def bitraverse[F[_]: Functor, C, D](f: A => F[C], g: B => F[D]): F[C Or D] =\n-    this match {\n-      case LOr(a) => Functor[F].map(f(a))(LOr(_))\n-      case ROr(b) => Functor[F].map(g(b))(ROr(_))\n-    }\n-\n-  /** Map on the right of this disjunction. */\n-  def map[D](g: B => D): (A Or D) =\n-    this match {\n-      case ROr(a)     => ROr(g(a))\n-      case b @ LOr(_) => b\n-    }\n-\n-  /** Traverse on the right of this disjunction. */\n-  def traverse[F[_]: Applicative, AA >: A, D](g: B => F[D]): F[AA Or D] =\n-    this match {\n-      case a @ LOr(_) => Applicative[F].pure(a)\n-      case ROr(b) => Functor[F].map(g(b))(ROr(_))\n-    }\n-\n-  /** Run the side-effect on the right of this disjunction. */\n-  def foreach(g: B => Unit): Unit = {\n-    bimap(_ => (), g)\n-    ()\n+  def bimap[C, D](fa: A => C, fb: B => D): C Or D = this match {\n+    case RightOr(b) => RightOr(fb(b))\n+    case LeftOr(a) => LeftOr(fa(a))\n   }\n \n-  /** Apply a function in the environment of the right of this disjunction. */\n-  def ap[AA >: A, C](f: => AA Or (B => C)): (AA Or C) =\n-    f flatMap (ff => map(ff(_)))\n-\n-  /** Bind through the right of this disjunction. */\n-  def flatMap[AA >: A, D](g: B => (AA Or D)): (AA Or D) =\n-    this match {\n-      case a @ LOr(_) => a\n-      case ROr(b) => g(b)\n-    }\n-\n-  /** Fold on the right of this disjunction. */\n-  def foldRight[Z](z: => Z)(f: (B, => Z) => Z): Z =\n-    this match {\n-      case LOr(_) => z\n-      case ROr(a) => f(a, z)\n-    }\n-\n-  /** Filter on the right of this disjunction. */\n-  def filter[AA >: A](p: B => Boolean)(implicit M: Monoid[AA]): (AA Or B) =\n-    this match {\n-      case LOr(_) => this\n-      case ROr(b) => if(p(b)) this else LOr(M.empty)\n-    }\n-\n-  /** Return `true` if this disjunction is a right value satisfying the given predicate. */\n-  def exists[BB >: B](p: BB => Boolean): Boolean =\n-    this match {\n-      case LOr(_) => false\n-      case ROr(b) => p(b)\n-    }\n-\n-  /** Return `true` if this disjunction is a left value or the right value satisfies the given predicate. */\n-  def forall[BB >: B](p: BB => Boolean): Boolean =\n-    this match {\n-      case LOr(_) => true\n-      case ROr(b) => p(b)\n-    }\n-\n-  /** Return an empty list or list with one element on the right of this disjunction. */\n-  def toList: List[B] =\n-    this match {\n-      case LOr(_) => Nil\n-      case ROr(b) => b :: Nil\n-    }\n-\n-  /** Return an empty stream or stream with one element on the right of this disjunction. */\n-  def toStream: Stream[B] =\n-    this match {\n-      case LOr(_) => Stream()\n-      case ROr(b) => Stream(b)\n-    }\n-\n-  /** Return an empty option or option with one element on the right of this disjunction. Useful to sweep errors under the carpet. */\n-  def toOption: Option[B] =\n-    this match {\n-      case LOr(_) => None\n-      case ROr(b) => Some(b)\n-    }\n-\n-  /*\n-  /** Return an empty maybe or option with one element on the right of this disjunction. Useful to sweep errors under the carpet. */\n-  def toMaybe[BB >: B]: Maybe[BB] =\n-    this match {\n-      case LOr(_) => Maybe.empty\n-      case ROr(b) => Maybe.just(b)\n-    }\n-  */\n-\n-  /** Convert to a core `scala.Either` at your own peril. */\n-  def toEither: Either[A, B] =\n-    this match {\n-      case LOr(a) => Left(a)\n-      case ROr(b) => Right(b)\n-    }\n-\n-  /** Return the right value of this disjunction or the given default if left. Alias for `|` */\n-  def getOrElse[BB >: B](x: => BB): BB =\n-    this match {\n-      case LOr(_) => x\n-      case ROr(b) => b\n-    }\n-\n-  /** Return the right value of this disjunction or the given default if left. Alias for `getOrElse` */\n-  def |[BB >: B](x: => BB): BB =\n-    getOrElse(x)\n-\n-  /** Return the right value of this disjunction or run the given function on the left. */\n-  def valueOr[BB >: B](x: A => BB): BB =\n-    this match {\n-      case LOr(a) => x(a)\n-      case ROr(b) => b\n-    }\n-\n-  /** Return this if it is a right, otherwise, return the given value. Alias for `|||` */\n-  def orElse[AA >: A, BB >: B](x: => AA Or BB): AA Or BB =\n-    this match {\n-      case LOr(_) => x\n-      case ROr(_) => this\n-    }\n-\n-  /** Return this if it is a right, otherwise, return the given value. Alias for `orElse` */\n-  def |||[AA >: A, BB >: B](x: => AA Or BB): AA Or BB =\n-    orElse(x)\n-\n-  /**\n-   * Sums up values inside disjunction, if both are left or right. Returns first left otherwise.\n-   * {{{\n-   * ROr(v1) +++ ROr(v2) → ROr(v1 + v2)\n-   * ROr(v1) +++ LOr(v2) → LOr(v2)\n-   * LOr(v1) +++ ROr(v2) → LOr(v1)\n-   * LOr(v1) +++ LOr(v2) → LOr(v1 + v2)\n-   * }}}\n-   */\n-  def +++[AA >: A, BB >: B](x: => AA Or BB)(implicit M1: Semigroup[BB], M2: Semigroup[AA]): AA Or BB =\n-    this match {\n-      case LOr(a1) => x match {\n-        case LOr(a2) => LOr(M2.combine(a1, a2))\n-        case ROr(_) => this\n-      }\n-      case ROr(b1) => x match {\n-        case b2 @ LOr(_) => b2\n-        case ROr(b2) => ROr(M1.combine(b1, b2))\n-      }\n-    }\n-\n-  /** Ensures that the right value of this disjunction satisfies the given predicate, or returns left with the given value. */\n-  def ensure[AA >: A](onLeft: => AA)(f: B => Boolean): (AA Or B) = this match {\n-    case ROr(b) => if (f(b)) this else LOr(onLeft)\n-    case LOr(_) => this\n+  def flatMap[AA >: A, D](f: B => AA Or D): AA Or D = this match {\n+    case RightOr(b) => f(b)\n+    case left @ LeftOr(_) => left\n   }\n \n-  /** Compare two disjunction values for equality. */\n-  def ===[AA >: A, BB >: B](x: AA Or BB)(implicit EA: Eq[AA], EB: Eq[BB]): Boolean =\n-    this match {\n-      case LOr(a1) => x match {\n-        case LOr(a2) => Eq[AA].eqv(a1, a2)\n-        case ROr(_) => false\n-      }\n-      case ROr(b1) => x match {\n-        case ROr(b2) => Eq[BB].eqv(b1, b2)\n-        case LOr(_) => false\n-      }\n-    }\n+  def map[D](f: B => D): A Or D = bimap(identity, f)\n \n-  /** Compare two disjunction values for ordering. */\n-  def compare[AA >: A, BB >: B](x: AA Or BB)(implicit EA: Order[AA], EB: Order[BB]): Int =\n-    this match {\n-      case LOr(a1) => x match {\n-        case LOr(a2) => Order[AA].compare(a1, a2)\n-        case ROr(_) => -1\n-      }\n-      case ROr(b1) => x match {\n-        case ROr(b2) => Order[BB].compare(b1, b2)\n-        case LOr(_) => 1\n-      }\n-    }\n-\n-  /*\n-  /** Show for a disjunction value. */\n-  def show[AA >: A, BB >: B](implicit SA: Show[AA], SB: Show[BB]): Cord =\n-    this match {\n-      case LOr(a) => (\"-\\Or(\": Cord) ++ SA.show(a) :- ')'\n-      case ROr(b) => (\"\\ROr(\": Cord) ++ SB.show(b) :- ')'\n-    }\n-\n-  /** Convert to a validation. */\n-  def validation: Validation[A, B] =\n-    this match {\n-      case LOr(a) => Failure(a)\n-      case ROr(b) => Success(b)\n-    }\n+  def leftMap[C](f: A => C): C Or B = bimap(f, identity)\n \n-  /** Run a validation function and back to disjunction again. Alias for `@\\?/` */\n-  def validationed[AA, BB](k: Validation[A, B] => Validation[AA, BB]): AA Or BB =\n-    k(validation).disjunction\n+  def compare[AA >: A, BB >: B](that: AA Or BB)(implicit AA: Order[AA], BB: Order[BB]): Int = fold(\n+    a => that.fold(AA.compare(a, _), _ => -1),\n+    b => that.fold(_ => 1, BB.compare(b, _))\n+  )\n \n-  /** Run a validation function and back to disjunction again. Alias for `validationed` */\n-  def @\\?/[AA, BB](k: Validation[A, B] => Validation[AA, BB]): AA Or BB =\n-    validationed(k)\n+  def traverse[F[_], AA >: A, D](f: B => F[D])(implicit F: Applicative[F]): F[AA Or D] = this match {\n+    case RightOr(b) => F.map(f(b))(Or.right _)\n+    case left @ LeftOr(_) => F.pure(left)\n+  }\n \n-  /** Return the value from whichever side of the disjunction is defined, given a commonly assignable type. */\n-  def merge[AA >: A](implicit ev: B <~< AA): AA =\n-    this match {\n-      case LOr(a) => a\n-      case ROr(b) => ev(b)\n-    }\n+  def foldLeft[C](c: C)(f: (C, B) => C): C = fold(_ => c, f(c, _))\n \n-  /** Convert to a These. */\n-  def toThese: A \\&/ B =\n-    fold(\n-      a => \\&/.This(a),\n-      b => \\&/.That(b)\n-    )\n-    */\n+  def foldRight[C](c: C)(f: (B, C) => C): C = fold(_ => c, f(_, c))\n \n+  def foldRight[C](c: Lazy[C])(f: (B, Lazy[C]) => C): Lazy[C] = fold(_ => c, b => Lazy(f(b, c)))\n }\n \n-/** A left disjunction\n- *\n- * Often used to represent the failure case of a result\n- */\n-final case class LOr[+A](a: A) extends (A Or Nothing)\n+object Or extends OrFunctions {\n+  case class LeftOr[+A](a: A) extends (A Or Nothing)\n \n-/** A right disjunction\n- *\n- * Often used to represent the success case of a result\n- */\n-final case class ROr[+B](b: B) extends (Nothing Or B)\n-\n-object Or extends OrInstances with OrFunctions {\n-\n-  /** Spin in tail-position on the right value of the given disjunction. */\n-  @annotation.tailrec\n-  final def loopRight[A, B, X](d: A Or B, left: A => X, right: B => X Or (A Or B)): X =\n-    d match {\n-      case LOr(a) => left(a)\n-      case ROr(b) => right(b) match {\n-        case LOr(x) => x\n-        case ROr(q) => loopRight(q, left, right)\n-      }\n-    }\n+  case class RightOr[+B](b: B) extends (Nothing Or B)\n \n-  /** Spin in tail-position on the left value of the given disjunction. */\n-  @annotation.tailrec\n-  final def loopLeft[A, B, X](d: A Or B, left: A => X Or (A Or B), right: B => X): X =\n-    d match {\n-      case LOr(a) => left(a) match {\n-        case LOr(x) => x\n-        case ROr(q) => loopLeft(q, left, right)\n-      }\n-      case ROr(b) => right(b)\n-    }\n-\n-}\n-\n-sealed abstract class OrInstances extends OrInstances0 {\n-  implicit def OrOrder[A: Order, B: Order]: Order[A Or B] =\n-    new Order[A Or B] {\n-      def compare(a1: A Or B, a2: A Or B) =\n-        a1 compare a2\n-      override def eqv(a1: A Or B, a2: A Or B) =\n-        a1 === a2\n-    }\n-\n-  implicit def OrMonoid[A: Semigroup, B: Monoid]: Monoid[A Or B] =\n-    new Monoid[A Or B] {\n-      def combine(a1: A Or B, a2: A Or B) =\n-        a1 +++ a2\n-      def empty =\n-        ROr(Monoid[B].empty)\n-    }\n-}\n-\n-sealed abstract class OrInstances0 extends OrInstances1 {\n-  implicit def OrEqual[A: Eq, B: Eq]: Eq[A Or B] =\n-    new Eq[A Or B] {\n-      def eqv(a1: A Or B, a2: A Or B) =\n-        a1 === a2\n+  implicit class MergeableOr[A](private val self: A Or A) extends AnyVal {","path":"data/src/main/scala/cats/data/Or.scala","position":432,"original_position":432,"commit_id":"75a1aa6e1b438282753283ef5cc992c7d78496e9","original_commit_id":"75a1aa6e1b438282753283ef5cc992c7d78496e9","user":{"login":"xuwei-k","id":389787,"avatar_url":"https://avatars.githubusercontent.com/u/389787?v=3","gravatar_id":"","url":"https://api.github.com/users/xuwei-k","html_url":"https://github.com/xuwei-k","followers_url":"https://api.github.com/users/xuwei-k/followers","following_url":"https://api.github.com/users/xuwei-k/following{/other_user}","gists_url":"https://api.github.com/users/xuwei-k/gists{/gist_id}","starred_url":"https://api.github.com/users/xuwei-k/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/xuwei-k/subscriptions","organizations_url":"https://api.github.com/users/xuwei-k/orgs","repos_url":"https://api.github.com/users/xuwei-k/repos","events_url":"https://api.github.com/users/xuwei-k/events{/privacy}","received_events_url":"https://api.github.com/users/xuwei-k/received_events","type":"User","site_admin":false},"body":"https://github.com/scalaz/scalaz/pull/580 discussion in scalaz","created_at":"2015-02-02T07:05:02Z","updated_at":"2015-02-02T07:05:02Z","html_url":"https://github.com/non/cats/pull/36#discussion_r23909529","pull_request_url":"https://api.github.com/repos/non/cats/pulls/36","_links":{"self":{"href":"https://api.github.com/repos/non/cats/pulls/comments/23909529"},"html":{"href":"https://github.com/non/cats/pull/36#discussion_r23909529"},"pull_request":{"href":"https://api.github.com/repos/non/cats/pulls/36"}}},"pull_request":{"url":"https://api.github.com/repos/non/cats/pulls/36","id":28446166,"html_url":"https://github.com/non/cats/pull/36","diff_url":"https://github.com/non/cats/pull/36.diff","patch_url":"https://github.com/non/cats/pull/36.patch","issue_url":"https://api.github.com/repos/non/cats/issues/36","number":36,"state":"open","locked":false,"title":"A mostly clean room reimplementation of Or.","user":{"login":"rossabaker","id":142698,"avatar_url":"https://avatars.githubusercontent.com/u/142698?v=3","gravatar_id":"","url":"https://api.github.com/users/rossabaker","html_url":"https://github.com/rossabaker","followers_url":"https://api.github.com/users/rossabaker/followers","following_url":"https://api.github.com/users/rossabaker/following{/other_user}","gists_url":"https://api.github.com/users/rossabaker/gists{/gist_id}","starred_url":"https://api.github.com/users/rossabaker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rossabaker/subscriptions","organizations_url":"https://api.github.com/users/rossabaker/orgs","repos_url":"https://api.github.com/users/rossabaker/repos","events_url":"https://api.github.com/users/rossabaker/events{/privacy}","received_events_url":"https://api.github.com/users/rossabaker/received_events","type":"User","site_admin":false},"body":"Implements feedback from #11.  Specifically:\r\n1. LOr and ROr move to `Or.LeftOr` and `Or.RightOr`.\r\n2. Constructors are still public, but `left` and `right` preserved in\r\n   `OrFunctions` to infer `Or`.  Use what you like.\r\n3. Only the Scaladoc is ripped from Scalaz.\r\n\r\nAlso tries to adhere to the emerging consensus on #27.\r\n\r\nPreliminary benchmarking showed monomorphism is faster than polymorphism,\r\nand that implementing other operations using fold/bimap is immeasurable.\r\nThe second finding is dubious with respect to allocations.  If someone\r\ncan prove these guilty via benchmark, we can revisit.\r\n\r\nI'd like to add tests after #29 happens.","created_at":"2015-02-02T05:29:46Z","updated_at":"2015-02-02T07:05:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d9bb10d1537f0bb635cd2bc26059a7ee04de8b5b","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/non/cats/pulls/36/commits","review_comments_url":"https://api.github.com/repos/non/cats/pulls/36/comments","review_comment_url":"https://api.github.com/repos/non/cats/pulls/comments/{number}","comments_url":"https://api.github.com/repos/non/cats/issues/36/comments","statuses_url":"https://api.github.com/repos/non/cats/statuses/75a1aa6e1b438282753283ef5cc992c7d78496e9","head":{"label":"rossabaker:topic/or-rewrite","ref":"topic/or-rewrite","sha":"75a1aa6e1b438282753283ef5cc992c7d78496e9","user":{"login":"rossabaker","id":142698,"avatar_url":"https://avatars.githubusercontent.com/u/142698?v=3","gravatar_id":"","url":"https://api.github.com/users/rossabaker","html_url":"https://github.com/rossabaker","followers_url":"https://api.github.com/users/rossabaker/followers","following_url":"https://api.github.com/users/rossabaker/following{/other_user}","gists_url":"https://api.github.com/users/rossabaker/gists{/gist_id}","starred_url":"https://api.github.com/users/rossabaker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rossabaker/subscriptions","organizations_url":"https://api.github.com/users/rossabaker/orgs","repos_url":"https://api.github.com/users/rossabaker/repos","events_url":"https://api.github.com/users/rossabaker/events{/privacy}","received_events_url":"https://api.github.com/users/rossabaker/received_events","type":"User","site_admin":false},"repo":{"id":30035669,"name":"cats","full_name":"rossabaker/cats","owner":{"login":"rossabaker","id":142698,"avatar_url":"https://avatars.githubusercontent.com/u/142698?v=3","gravatar_id":"","url":"https://api.github.com/users/rossabaker","html_url":"https://github.com/rossabaker","followers_url":"https://api.github.com/users/rossabaker/followers","following_url":"https://api.github.com/users/rossabaker/following{/other_user}","gists_url":"https://api.github.com/users/rossabaker/gists{/gist_id}","starred_url":"https://api.github.com/users/rossabaker/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rossabaker/subscriptions","organizations_url":"https://api.github.com/users/rossabaker/orgs","repos_url":"https://api.github.com/users/rossabaker/repos","events_url":"https://api.github.com/users/rossabaker/events{/privacy}","received_events_url":"https://api.github.com/users/rossabaker/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rossabaker/cats","description":"","fork":true,"url":"https://api.github.com/repos/rossabaker/cats","forks_url":"https://api.github.com/repos/rossabaker/cats/forks","keys_url":"https://api.github.com/repos/rossabaker/cats/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rossabaker/cats/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rossabaker/cats/teams","hooks_url":"https://api.github.com/repos/rossabaker/cats/hooks","issue_events_url":"https://api.github.com/repos/rossabaker/cats/issues/events{/number}","events_url":"https://api.github.com/repos/rossabaker/cats/events","assignees_url":"https://api.github.com/repos/rossabaker/cats/assignees{/user}","branches_url":"https://api.github.com/repos/rossabaker/cats/branches{/branch}","tags_url":"https://api.github.com/repos/rossabaker/cats/tags","blobs_url":"https://api.github.com/repos/rossabaker/cats/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rossabaker/cats/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rossabaker/cats/git/refs{/sha}","trees_url":"https://api.github.com/repos/rossabaker/cats/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rossabaker/cats/statuses/{sha}","languages_url":"https://api.github.com/repos/rossabaker/cats/languages","stargazers_url":"https://api.github.com/repos/rossabaker/cats/stargazers","contributors_url":"https://api.github.com/repos/rossabaker/cats/contributors","subscribers_url":"https://api.github.com/repos/rossabaker/cats/subscribers","subscription_url":"https://api.github.com/repos/rossabaker/cats/subscription","commits_url":"https://api.github.com/repos/rossabaker/cats/commits{/sha}","git_commits_url":"https://api.github.com/repos/rossabaker/cats/git/commits{/sha}","comments_url":"https://api.github.com/repos/rossabaker/cats/comments{/number}","issue_comment_url":"https://api.github.com/repos/rossabaker/cats/issues/comments/{number}","contents_url":"https://api.github.com/repos/rossabaker/cats/contents/{+path}","compare_url":"https://api.github.com/repos/rossabaker/cats/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rossabaker/cats/merges","archive_url":"https://api.github.com/repos/rossabaker/cats/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rossabaker/cats/downloads","issues_url":"https://api.github.com/repos/rossabaker/cats/issues{/number}","pulls_url":"https://api.github.com/repos/rossabaker/cats/pulls{/number}","milestones_url":"https://api.github.com/repos/rossabaker/cats/milestones{/number}","notifications_url":"https://api.github.com/repos/rossabaker/cats/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rossabaker/cats/labels{/name}","releases_url":"https://api.github.com/repos/rossabaker/cats/releases{/id}","created_at":"2015-01-29T18:53:10Z","updated_at":"2015-01-30T20:37:38Z","pushed_at":"2015-02-02T05:28:48Z","git_url":"git://github.com/rossabaker/cats.git","ssh_url":"git@github.com:rossabaker/cats.git","clone_url":"https://github.com/rossabaker/cats.git","svn_url":"https://github.com/rossabaker/cats","homepage":null,"size":172,"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":"non:master","ref":"master","sha":"52b6c0859af1d75f9503ef91b71802b2c45064bf","user":{"login":"non","id":218045,"avatar_url":"https://avatars.githubusercontent.com/u/218045?v=3","gravatar_id":"","url":"https://api.github.com/users/non","html_url":"https://github.com/non","followers_url":"https://api.github.com/users/non/followers","following_url":"https://api.github.com/users/non/following{/other_user}","gists_url":"https://api.github.com/users/non/gists{/gist_id}","starred_url":"https://api.github.com/users/non/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/non/subscriptions","organizations_url":"https://api.github.com/users/non/orgs","repos_url":"https://api.github.com/users/non/repos","events_url":"https://api.github.com/users/non/events{/privacy}","received_events_url":"https://api.github.com/users/non/received_events","type":"User","site_admin":false},"repo":{"id":29986727,"name":"cats","full_name":"non/cats","owner":{"login":"non","id":218045,"avatar_url":"https://avatars.githubusercontent.com/u/218045?v=3","gravatar_id":"","url":"https://api.github.com/users/non","html_url":"https://github.com/non","followers_url":"https://api.github.com/users/non/followers","following_url":"https://api.github.com/users/non/following{/other_user}","gists_url":"https://api.github.com/users/non/gists{/gist_id}","starred_url":"https://api.github.com/users/non/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/non/subscriptions","organizations_url":"https://api.github.com/users/non/orgs","repos_url":"https://api.github.com/users/non/repos","events_url":"https://api.github.com/users/non/events{/privacy}","received_events_url":"https://api.github.com/users/non/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/non/cats","description":"","fork":false,"url":"https://api.github.com/repos/non/cats","forks_url":"https://api.github.com/repos/non/cats/forks","keys_url":"https://api.github.com/repos/non/cats/keys{/key_id}","collaborators_url":"https://api.github.com/repos/non/cats/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/non/cats/teams","hooks_url":"https://api.github.com/repos/non/cats/hooks","issue_events_url":"https://api.github.com/repos/non/cats/issues/events{/number}","events_url":"https://api.github.com/repos/non/cats/events","assignees_url":"https://api.github.com/repos/non/cats/assignees{/user}","branches_url":"https://api.github.com/repos/non/cats/branches{/branch}","tags_url":"https://api.github.com/repos/non/cats/tags","blobs_url":"https://api.github.com/repos/non/cats/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/non/cats/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/non/cats/git/refs{/sha}","trees_url":"https://api.github.com/repos/non/cats/git/trees{/sha}","statuses_url":"https://api.github.com/repos/non/cats/statuses/{sha}","languages_url":"https://api.github.com/repos/non/cats/languages","stargazers_url":"https://api.github.com/repos/non/cats/stargazers","contributors_url":"https://api.github.com/repos/non/cats/contributors","subscribers_url":"https://api.github.com/repos/non/cats/subscribers","subscription_url":"https://api.github.com/repos/non/cats/subscription","commits_url":"https://api.github.com/repos/non/cats/commits{/sha}","git_commits_url":"https://api.github.com/repos/non/cats/git/commits{/sha}","comments_url":"https://api.github.com/repos/non/cats/comments{/number}","issue_comment_url":"https://api.github.com/repos/non/cats/issues/comments/{number}","contents_url":"https://api.github.com/repos/non/cats/contents/{+path}","compare_url":"https://api.github.com/repos/non/cats/compare/{base}...{head}","merges_url":"https://api.github.com/repos/non/cats/merges","archive_url":"https://api.github.com/repos/non/cats/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/non/cats/downloads","issues_url":"https://api.github.com/repos/non/cats/issues{/number}","pulls_url":"https://api.github.com/repos/non/cats/pulls{/number}","milestones_url":"https://api.github.com/repos/non/cats/milestones{/number}","notifications_url":"https://api.github.com/repos/non/cats/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/non/cats/labels{/name}","releases_url":"https://api.github.com/repos/non/cats/releases{/id}","created_at":"2015-01-28T20:26:48Z","updated_at":"2015-02-02T06:06:57Z","pushed_at":"2015-02-02T02:44:46Z","git_url":"git://github.com/non/cats.git","ssh_url":"git@github.com:non/cats.git","clone_url":"https://github.com/non/cats.git","svn_url":"https://github.com/non/cats","homepage":null,"size":371,"stargazers_count":129,"watchers_count":129,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":18,"mirror_url":null,"open_issues_count":20,"forks":18,"open_issues":20,"watchers":129,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/non/cats/pulls/36"},"html":{"href":"https://github.com/non/cats/pull/36"},"issue":{"href":"https://api.github.com/repos/non/cats/issues/36"},"comments":{"href":"https://api.github.com/repos/non/cats/issues/36/comments"},"review_comments":{"href":"https://api.github.com/repos/non/cats/pulls/36/comments"},"review_comment":{"href":"https://api.github.com/repos/non/cats/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/non/cats/pulls/36/commits"},"statuses":{"href":"https://api.github.com/repos/non/cats/statuses/75a1aa6e1b438282753283ef5cc992c7d78496e9"}}}}