{"action":"created","comment":{"url":"https://api.github.com/repos/tonyday567/numhask/pulls/comments/193212264","pull_request_review_id":126140855,"id":193212264,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5MzIxMjI2NA==","diff_hunk":"@@ -0,0 +1,500 @@\n+{-# LANGUAGE DeriveGeneric, DeriveDataTypeable, DeriveFunctor, GeneralizedNewtypeDeriving, DeriveFoldable, DeriveTraversable, GADTs #-}\n+{-# LANGUAGE FlexibleInstances, FlexibleContexts, UndecidableInstances, MultiParamTypeClasses #-}\n+module NumHask.Data.LogField where\n+\n+import           GHC.Generics                   ( Generic\n+                                                , Generic1\n+                                                )\n+import           Data.Data                      ( Data )\n+\n+import           NumHask.Algebra.Additive\n+import           NumHask.Algebra.Multiplicative\n+import           NumHask.Algebra.Distribution\n+import           NumHask.Algebra.Field\n+import           NumHask.Algebra.Integral\n+import           NumHask.Algebra.Rational\n+\n+import           Prelude                 hiding ( Num(..)\n+                                                , negate\n+                                                , sin\n+                                                , cos\n+                                                , sqrt\n+                                                , (/)\n+                                                , atan\n+                                                , pi\n+                                                , exp\n+                                                , log\n+                                                , recip\n+                                                , (**)\n+                                                , toInteger\n+                                                )\n+import qualified Data.Foldable                 as F\n+\n+-- LogField is adapted from LogFloat\n+----------------------------------------------------------------\n+--                                                  ~ 2015.08.06\n+-- |\n+-- Module      :  Data.Number.LogFloat\n+-- Copyright   :  Copyright (c) 2007--2015 wren gayle romano\n+-- License     :  BSD3\n+-- Maintainer  :  wren@community.haskell.org\n+-- Stability   :  stable\n+-- Portability :  portable (with CPP, FFI)\n+-- Link        :  https://hackage.haskell.org/package/logfloat\n+----------------------------------------------------------------\n+\n+----------------------------------------------------------------\n+--\n+-- | A @LogField@ is just a 'Field' with a special interpretation.\n+-- The 'LogField' function is presented instead of the constructor,\n+-- in order to ensure semantic conversion. At present the 'Show'\n+-- instance will convert back to the normal-domain, and hence will\n+-- underflow at that point. This behavior may change in the future.\n+--\n+-- Because 'logField' performs the semantic conversion, we can use\n+-- operators which say what we *mean* rather than saying what we're\n+-- actually doing to the underlying representation. That is,\n+-- equivalences like the following are true[1] thanks to type-class\n+-- overloading:\n+--\n+-- > logField (p + q) == logField p + logField q\n+-- > logField (p * q) == logField p * logField q\n+--\n+-- TODO: what to do with this note?\n+-- (Do note, however, that subtraction can and negation will throw\n+-- errors: since @LogField@ can only represent the positive half of\n+-- 'Double'. 'Num' is the wrong abstraction to put at the bottom\n+-- of the numeric type-class hierarchy; but alas, we're stuck with\n+-- it.)\n+--\n+-- Performing operations in the log-domain is cheap, prevents\n+-- underflow, and is otherwise very nice for dealing with miniscule\n+-- probabilities. However, crossing into and out of the log-domain\n+-- is expensive and should be avoided as much as possible. In\n+-- particular, if you're doing a series of multiplications as in\n+-- @lp * LogField q * LogField r@ it's faster to do @lp * LogField\n+-- (q * r)@ if you're reasonably sure the normal-domain multiplication\n+-- won't underflow; because that way you enter the log-domain only\n+-- once, instead of twice. Also note that, for precision, if you're\n+-- doing more than a few multiplications in the log-domain, you\n+-- should use 'product' rather than using '(*)' repeatedly.\n+--\n+-- Even more particularly, you should /avoid addition/ whenever\n+-- possible. Addition is provided because sometimes we need it, and\n+-- the proper implementation is not immediately apparent. However,\n+-- between two @LogField@s addition requires crossing the exp\\/log\n+-- boundary twice; with a @LogField@ and a 'Double' it's three\n+-- times, since the regular number needs to enter the log-domain\n+-- first. This makes addition incredibly slow. Again, if you can\n+-- parenthesize to do normal-domain operations first, do it!\n+--\n+-- [1] That is, true up-to underflow and floating point fuzziness.\n+-- Which is, of course, the whole point of this module.\n+newtype LogField a = LogField a\n+      deriving (Eq, Ord, Read, Data, Generic, Generic1, Functor, Foldable, Traversable)\n+    -- TODO original has comment: , Ord -- Should we really perpetuate the Ord lie?\n+    -- why is the comment there?\n+\n+----------------------------------------------------------------\n+-- | Constructor which does semantic conversion from normal-domain\n+-- to log-domain. Throws errors on negative and NaN inputs. If @p@\n+-- is non-negative, then following equivalence holds:\n+--\n+-- > logField p == logToLogField (log p)\n+logField :: (ExpField a) => a -> LogField a\n+{-# INLINE [0] logField #-}\n+-- TODO: should we use NOINLINE or [~0] to avoid the possibility of code bloat?\n+logField = LogField . log\n+\n+\n+-- TODO: figure out what to do here, removed guards\n+-- | Constructor which assumes the argument is already in the\n+-- log-domain.\n+logToLogField :: a -> LogField a\n+logToLogField = LogField\n+\n+\n+-- | Semantically convert our log-domain value back into the\n+-- normal-domain. Beware of overflow\\/underflow. The following\n+-- equivalence holds (without qualification):\n+--\n+-- > fromLogField == exp . logFromLogField\n+--\n+fromLogField :: ExpField a => LogField a -> a\n+{-# INLINE [0] fromLogField #-}\n+-- TODO: should we use NOINLINE or [~0] to avoid the possibility of code bloat?\n+fromLogField (LogField x) = exp x\n+\n+\n+-- | Return the log-domain value itself without conversion.\n+logFromLogField :: LogField a -> a\n+logFromLogField (LogField x) = x\n+\n+\n+-- These are our module-specific versions of \"log\\/exp\" and \"exp\\/log\";\n+-- They do the same things but also have a @LogField@ in between\n+-- the logarithm and exponentiation. In order to ensure these rules\n+-- fire, we have to delay the inlining on two of the four\n+-- con-\\/destructors.\n+\n+{-# RULES\n+-- Out of log-domain and back in\n+\"log/fromLogField\"       forall x. log (fromLogField x) = logFromLogField x\n+\"LogField/fromLogField\"  forall x. LogField (fromLogField x) = x\n+\n+-- Into log-domain and back out\n+\"fromLogField/LogField\"  forall x. fromLogField (LogField x) = x\n+    #-}\n+\n+----------------------------------------------------------------\n+-- To show it, we want to show the normal-domain value rather than\n+-- the log-domain value. Also, if someone managed to break our\n+-- invariants (e.g. by passing in a negative and noone's pulled on\n+-- the thunk yet) then we want to crash before printing the\n+-- constructor, rather than after.  N.B. This means the show will\n+-- underflow\\/overflow in the same places as normal doubles since\n+-- we underflow at the @exp@. Perhaps this means we should show the\n+-- log-domain value instead.\n+\n+instance (ExpField a, Show a) => Show (LogField a) where\n+    showsPrec p (LogField x) =\n+        let y = exp x in y `seq`\n+        showParen (p > 9)\n+            ( showString \"LogField \"\n+            . showsPrec 11 y\n+            )\n+\n+\n+-- TODO: never worked with FFI, so i don't really know what's going on\n+----------------------------------------------------------------\n+-- Technically these should use 'Foreign.C.CDouble' however there's\n+-- no isomorphism provided to normal 'Double'. The former is\n+-- documented as being a newtype of the later, and so this should\n+-- be safe.\n+\n+-- #ifdef __USE_FFI__\n+-- #define LOG1P_WHICH_VERSION FFI version.\n+-- #else\n+-- #define LOG1P_WHICH_VERSION naive version! \\\n+--     Contact the maintainer with any FFI difficulties.\n+-- #endif\n+\n+\n+-- | Definition: @log1p == log . (1+)@. Standard C libraries provide\n+-- a special definition for 'log1p' which is more accurate than\n+-- doing the naive thing, especially for very small arguments. For\n+-- example, the naive version underflows around @2 ** -53@, whereas\n+-- the specialized version underflows around @2 ** -1074@. This\n+-- function is used by ('+') and ('-') on @LogField@.\n+--\n+-- N.B. The @statistics:Statistics.Math@ module provides a pure\n+-- Haskell implementation of @log1p@ for those who are interested.\n+-- We do not copy it here because it relies on the @vector@ package\n+-- which is non-portable. If there is sufficient interest, a portable\n+-- variant of that implementation could be made. Contact the\n+-- maintainer if the FFI and naive implementations are insufficient\n+-- for your needs.\n+--\n+-- /This installation was compiled to use the LOG1P_WHICH_VERSION/\n+\n+-- #ifdef __USE_FFI__\n+-- foreign import ccall unsafe \"math.h log1p\"\n+--     log1p :: Double -> Double\n+-- #else\n+-- See statistics:Statistics.Math for a more accurate Haskell\n+-- implementation.\n+log1p :: ExpField a => a -> a\n+{-# INLINE [0] log1p #-}\n+log1p x = log (one + x)\n+-- #endif\n+\n+\n+-- | Definition: @expm1 == subtract 1 . exp@. Standard C libraries\n+-- provide a special definition for 'expm1' which is more accurate\n+-- than doing the naive thing, especially for very small arguments.\n+-- This function isn't needed internally, but is provided for\n+-- symmetry with 'log1p'.\n+--\n+-- /This installation was compiled to use the LOG1P_WHICH_VERSION/\n+\n+-- #ifdef __USE_FFI__\n+-- foreign import ccall unsafe \"math.h expm1\"\n+--     expm1 :: Double -> Double\n+-- #else\n+expm1 :: ExpField a => a -> a\n+{-# INLINE [0] expm1 #-}\n+expm1 x = exp x - one\n+-- #endif\n+\n+-- CPP guarded because they won't fire if we're using the FFI versions\n+-- #if !defined(__USE_FFI__)\n+{-# RULES\n+-- Into log-domain and back out\n+\"expm1/log1p\"    forall x. expm1 (log1p x) = x\n+\n+-- Out of log-domain and back in\n+\"log1p/expm1\"    forall x. log1p (expm1 x) = x\n+    #-}\n+-- #endif\n+\n+instance (ExpField a, LowerBoundedField a, Ord a) => AdditiveMagma (LogField a) where\n+      (LogField x) `plus` (LogField y)\n+            -- TODO unsure what to do here...currentl only negInfinity because of the 0-element\n+            | x == y\n+            && x == negInfinity\n+            && y == negInfinity = LogField x -- @0+0 == 0@,","path":"numhask/src/NumHask/Data/LogField.hs","position":245,"original_position":245,"commit_id":"2fe565a9ae7eb9c0ea9c0e4cadddf504ae1a1124","original_commit_id":"2fe565a9ae7eb9c0ea9c0e4cadddf504ae1a1124","user":{"login":"LeanderK","id":2179853,"node_id":"MDQ6VXNlcjIxNzk4NTM=","avatar_url":"https://avatars2.githubusercontent.com/u/2179853?v=4","gravatar_id":"","url":"https://api.github.com/users/LeanderK","html_url":"https://github.com/LeanderK","followers_url":"https://api.github.com/users/LeanderK/followers","following_url":"https://api.github.com/users/LeanderK/following{/other_user}","gists_url":"https://api.github.com/users/LeanderK/gists{/gist_id}","starred_url":"https://api.github.com/users/LeanderK/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeanderK/subscriptions","organizations_url":"https://api.github.com/users/LeanderK/orgs","repos_url":"https://api.github.com/users/LeanderK/repos","events_url":"https://api.github.com/users/LeanderK/events{/privacy}","received_events_url":"https://api.github.com/users/LeanderK/received_events","type":"User","site_admin":false},"body":"ah! yeah, that's smart 😉","created_at":"2018-06-05T20:32:45Z","updated_at":"2018-06-05T20:32:45Z","html_url":"https://github.com/tonyday567/numhask/pull/66#discussion_r193212264","pull_request_url":"https://api.github.com/repos/tonyday567/numhask/pulls/66","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/comments/193212264"},"html":{"href":"https://github.com/tonyday567/numhask/pull/66#discussion_r193212264"},"pull_request":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/66"}},"in_reply_to_id":192952182},"pull_request":{"url":"https://api.github.com/repos/tonyday567/numhask/pulls/66","id":192423900,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkyNDIzOTAw","html_url":"https://github.com/tonyday567/numhask/pull/66","diff_url":"https://github.com/tonyday567/numhask/pull/66.diff","patch_url":"https://github.com/tonyday567/numhask/pull/66.patch","issue_url":"https://api.github.com/repos/tonyday567/numhask/issues/66","number":66,"state":"open","locked":false,"title":"LogField","user":{"login":"LeanderK","id":2179853,"node_id":"MDQ6VXNlcjIxNzk4NTM=","avatar_url":"https://avatars2.githubusercontent.com/u/2179853?v=4","gravatar_id":"","url":"https://api.github.com/users/LeanderK","html_url":"https://github.com/LeanderK","followers_url":"https://api.github.com/users/LeanderK/followers","following_url":"https://api.github.com/users/LeanderK/following{/other_user}","gists_url":"https://api.github.com/users/LeanderK/gists{/gist_id}","starred_url":"https://api.github.com/users/LeanderK/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeanderK/subscriptions","organizations_url":"https://api.github.com/users/LeanderK/orgs","repos_url":"https://api.github.com/users/LeanderK/repos","events_url":"https://api.github.com/users/LeanderK/events{/privacy}","received_events_url":"https://api.github.com/users/LeanderK/received_events","type":"User","site_admin":false},"body":"**Not ready for merge yet!**\r\nLogField is not ready for merge yet, but I wanted some feedback whether I am on the right track with my implementation.\r\n\r\nFor a better understanding I commented out the existing Num-instance instead of removing it.\r\n\r\nThe pull-request handles issue #54.","created_at":"2018-06-04T14:19:55Z","updated_at":"2018-06-05T20:32:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"68e9c91876e807d22500ae8803a7393f9884b4ca","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/tonyday567/numhask/pulls/66/commits","review_comments_url":"https://api.github.com/repos/tonyday567/numhask/pulls/66/comments","review_comment_url":"https://api.github.com/repos/tonyday567/numhask/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tonyday567/numhask/issues/66/comments","statuses_url":"https://api.github.com/repos/tonyday567/numhask/statuses/2fe565a9ae7eb9c0ea9c0e4cadddf504ae1a1124","head":{"label":"LeanderK:master","ref":"master","sha":"2fe565a9ae7eb9c0ea9c0e4cadddf504ae1a1124","user":{"login":"LeanderK","id":2179853,"node_id":"MDQ6VXNlcjIxNzk4NTM=","avatar_url":"https://avatars2.githubusercontent.com/u/2179853?v=4","gravatar_id":"","url":"https://api.github.com/users/LeanderK","html_url":"https://github.com/LeanderK","followers_url":"https://api.github.com/users/LeanderK/followers","following_url":"https://api.github.com/users/LeanderK/following{/other_user}","gists_url":"https://api.github.com/users/LeanderK/gists{/gist_id}","starred_url":"https://api.github.com/users/LeanderK/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeanderK/subscriptions","organizations_url":"https://api.github.com/users/LeanderK/orgs","repos_url":"https://api.github.com/users/LeanderK/repos","events_url":"https://api.github.com/users/LeanderK/events{/privacy}","received_events_url":"https://api.github.com/users/LeanderK/received_events","type":"User","site_admin":false},"repo":{"id":136035457,"node_id":"MDEwOlJlcG9zaXRvcnkxMzYwMzU0NTc=","name":"numhask","full_name":"LeanderK/numhask","owner":{"login":"LeanderK","id":2179853,"node_id":"MDQ6VXNlcjIxNzk4NTM=","avatar_url":"https://avatars2.githubusercontent.com/u/2179853?v=4","gravatar_id":"","url":"https://api.github.com/users/LeanderK","html_url":"https://github.com/LeanderK","followers_url":"https://api.github.com/users/LeanderK/followers","following_url":"https://api.github.com/users/LeanderK/following{/other_user}","gists_url":"https://api.github.com/users/LeanderK/gists{/gist_id}","starred_url":"https://api.github.com/users/LeanderK/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/LeanderK/subscriptions","organizations_url":"https://api.github.com/users/LeanderK/orgs","repos_url":"https://api.github.com/users/LeanderK/repos","events_url":"https://api.github.com/users/LeanderK/events{/privacy}","received_events_url":"https://api.github.com/users/LeanderK/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/LeanderK/numhask","description":"A haskell numeric prelude, providing a clean structure for numbers and operations that combine them.","fork":true,"url":"https://api.github.com/repos/LeanderK/numhask","forks_url":"https://api.github.com/repos/LeanderK/numhask/forks","keys_url":"https://api.github.com/repos/LeanderK/numhask/keys{/key_id}","collaborators_url":"https://api.github.com/repos/LeanderK/numhask/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/LeanderK/numhask/teams","hooks_url":"https://api.github.com/repos/LeanderK/numhask/hooks","issue_events_url":"https://api.github.com/repos/LeanderK/numhask/issues/events{/number}","events_url":"https://api.github.com/repos/LeanderK/numhask/events","assignees_url":"https://api.github.com/repos/LeanderK/numhask/assignees{/user}","branches_url":"https://api.github.com/repos/LeanderK/numhask/branches{/branch}","tags_url":"https://api.github.com/repos/LeanderK/numhask/tags","blobs_url":"https://api.github.com/repos/LeanderK/numhask/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/LeanderK/numhask/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/LeanderK/numhask/git/refs{/sha}","trees_url":"https://api.github.com/repos/LeanderK/numhask/git/trees{/sha}","statuses_url":"https://api.github.com/repos/LeanderK/numhask/statuses/{sha}","languages_url":"https://api.github.com/repos/LeanderK/numhask/languages","stargazers_url":"https://api.github.com/repos/LeanderK/numhask/stargazers","contributors_url":"https://api.github.com/repos/LeanderK/numhask/contributors","subscribers_url":"https://api.github.com/repos/LeanderK/numhask/subscribers","subscription_url":"https://api.github.com/repos/LeanderK/numhask/subscription","commits_url":"https://api.github.com/repos/LeanderK/numhask/commits{/sha}","git_commits_url":"https://api.github.com/repos/LeanderK/numhask/git/commits{/sha}","comments_url":"https://api.github.com/repos/LeanderK/numhask/comments{/number}","issue_comment_url":"https://api.github.com/repos/LeanderK/numhask/issues/comments{/number}","contents_url":"https://api.github.com/repos/LeanderK/numhask/contents/{+path}","compare_url":"https://api.github.com/repos/LeanderK/numhask/compare/{base}...{head}","merges_url":"https://api.github.com/repos/LeanderK/numhask/merges","archive_url":"https://api.github.com/repos/LeanderK/numhask/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/LeanderK/numhask/downloads","issues_url":"https://api.github.com/repos/LeanderK/numhask/issues{/number}","pulls_url":"https://api.github.com/repos/LeanderK/numhask/pulls{/number}","milestones_url":"https://api.github.com/repos/LeanderK/numhask/milestones{/number}","notifications_url":"https://api.github.com/repos/LeanderK/numhask/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/LeanderK/numhask/labels{/name}","releases_url":"https://api.github.com/repos/LeanderK/numhask/releases{/id}","deployments_url":"https://api.github.com/repos/LeanderK/numhask/deployments","created_at":"2018-06-04T14:15:11Z","updated_at":"2018-06-04T14:15:56Z","pushed_at":"2018-06-05T20:23:32Z","git_url":"git://github.com/LeanderK/numhask.git","ssh_url":"git@github.com:LeanderK/numhask.git","clone_url":"https://github.com/LeanderK/numhask.git","svn_url":"https://github.com/LeanderK/numhask","homepage":"","size":305,"stargazers_count":0,"watchers_count":0,"language":"Haskell","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"tonyday567:master","ref":"master","sha":"a2e3d556776ecb43cff4e60700430bcb6fe1dce5","user":{"login":"tonyday567","id":1622093,"node_id":"MDQ6VXNlcjE2MjIwOTM=","avatar_url":"https://avatars3.githubusercontent.com/u/1622093?v=4","gravatar_id":"","url":"https://api.github.com/users/tonyday567","html_url":"https://github.com/tonyday567","followers_url":"https://api.github.com/users/tonyday567/followers","following_url":"https://api.github.com/users/tonyday567/following{/other_user}","gists_url":"https://api.github.com/users/tonyday567/gists{/gist_id}","starred_url":"https://api.github.com/users/tonyday567/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tonyday567/subscriptions","organizations_url":"https://api.github.com/users/tonyday567/orgs","repos_url":"https://api.github.com/users/tonyday567/repos","events_url":"https://api.github.com/users/tonyday567/events{/privacy}","received_events_url":"https://api.github.com/users/tonyday567/received_events","type":"User","site_admin":false},"repo":{"id":86944206,"node_id":"MDEwOlJlcG9zaXRvcnk4Njk0NDIwNg==","name":"numhask","full_name":"tonyday567/numhask","owner":{"login":"tonyday567","id":1622093,"node_id":"MDQ6VXNlcjE2MjIwOTM=","avatar_url":"https://avatars3.githubusercontent.com/u/1622093?v=4","gravatar_id":"","url":"https://api.github.com/users/tonyday567","html_url":"https://github.com/tonyday567","followers_url":"https://api.github.com/users/tonyday567/followers","following_url":"https://api.github.com/users/tonyday567/following{/other_user}","gists_url":"https://api.github.com/users/tonyday567/gists{/gist_id}","starred_url":"https://api.github.com/users/tonyday567/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tonyday567/subscriptions","organizations_url":"https://api.github.com/users/tonyday567/orgs","repos_url":"https://api.github.com/users/tonyday567/repos","events_url":"https://api.github.com/users/tonyday567/events{/privacy}","received_events_url":"https://api.github.com/users/tonyday567/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tonyday567/numhask","description":"A haskell numeric prelude, providing a clean structure for numbers and operations that combine them.","fork":false,"url":"https://api.github.com/repos/tonyday567/numhask","forks_url":"https://api.github.com/repos/tonyday567/numhask/forks","keys_url":"https://api.github.com/repos/tonyday567/numhask/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tonyday567/numhask/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tonyday567/numhask/teams","hooks_url":"https://api.github.com/repos/tonyday567/numhask/hooks","issue_events_url":"https://api.github.com/repos/tonyday567/numhask/issues/events{/number}","events_url":"https://api.github.com/repos/tonyday567/numhask/events","assignees_url":"https://api.github.com/repos/tonyday567/numhask/assignees{/user}","branches_url":"https://api.github.com/repos/tonyday567/numhask/branches{/branch}","tags_url":"https://api.github.com/repos/tonyday567/numhask/tags","blobs_url":"https://api.github.com/repos/tonyday567/numhask/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tonyday567/numhask/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tonyday567/numhask/git/refs{/sha}","trees_url":"https://api.github.com/repos/tonyday567/numhask/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tonyday567/numhask/statuses/{sha}","languages_url":"https://api.github.com/repos/tonyday567/numhask/languages","stargazers_url":"https://api.github.com/repos/tonyday567/numhask/stargazers","contributors_url":"https://api.github.com/repos/tonyday567/numhask/contributors","subscribers_url":"https://api.github.com/repos/tonyday567/numhask/subscribers","subscription_url":"https://api.github.com/repos/tonyday567/numhask/subscription","commits_url":"https://api.github.com/repos/tonyday567/numhask/commits{/sha}","git_commits_url":"https://api.github.com/repos/tonyday567/numhask/git/commits{/sha}","comments_url":"https://api.github.com/repos/tonyday567/numhask/comments{/number}","issue_comment_url":"https://api.github.com/repos/tonyday567/numhask/issues/comments{/number}","contents_url":"https://api.github.com/repos/tonyday567/numhask/contents/{+path}","compare_url":"https://api.github.com/repos/tonyday567/numhask/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tonyday567/numhask/merges","archive_url":"https://api.github.com/repos/tonyday567/numhask/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tonyday567/numhask/downloads","issues_url":"https://api.github.com/repos/tonyday567/numhask/issues{/number}","pulls_url":"https://api.github.com/repos/tonyday567/numhask/pulls{/number}","milestones_url":"https://api.github.com/repos/tonyday567/numhask/milestones{/number}","notifications_url":"https://api.github.com/repos/tonyday567/numhask/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tonyday567/numhask/labels{/name}","releases_url":"https://api.github.com/repos/tonyday567/numhask/releases{/id}","deployments_url":"https://api.github.com/repos/tonyday567/numhask/deployments","created_at":"2017-04-01T21:35:34Z","updated_at":"2018-06-04T16:30:12Z","pushed_at":"2018-06-05T20:23:33Z","git_url":"git://github.com/tonyday567/numhask.git","ssh_url":"git@github.com:tonyday567/numhask.git","clone_url":"https://github.com/tonyday567/numhask.git","svn_url":"https://github.com/tonyday567/numhask","homepage":"","size":296,"stargazers_count":31,"watchers_count":31,"language":"Haskell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"archived":false,"open_issues_count":22,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":8,"open_issues":22,"watchers":31,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/66"},"html":{"href":"https://github.com/tonyday567/numhask/pull/66"},"issue":{"href":"https://api.github.com/repos/tonyday567/numhask/issues/66"},"comments":{"href":"https://api.github.com/repos/tonyday567/numhask/issues/66/comments"},"review_comments":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/66/comments"},"review_comment":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tonyday567/numhask/pulls/66/commits"},"statuses":{"href":"https://api.github.com/repos/tonyday567/numhask/statuses/2fe565a9ae7eb9c0ea9c0e4cadddf504ae1a1124"}},"author_association":"NONE"}}
{"actor":{"display_login":"LeanderK"}}