PLFA agda exercises
--------------------------------------------------------------------------------
-- Contributors
--------------------------------------------------------------------------------

module Buildfile.Contributor where

import Data.Aeson.Types
import Data.Text (Text)
import Text.Printf (printf)

data Contributor = Contributor
  { contributorName   :: Text
  , contributorGithub :: Text
  , contributorCount  :: Int
  }
  deriving (Show)

instance ToJSON Contributor where
  toJSON Contributor{..} =
    object [ "name"    .= contributorName
           , "github"  .= contributorGithub
           , "count"   .= contributorCount
           ]

instance FromJSON Contributor where
  parseJSON = withObject "Contributor" $ \v -> Contributor
    <$> v .: "name"
    <*> v .: "github"
    <*> v .: "count"

instance Semigroup Contributor where
  Contributor _name1 github1 count1 <> Contributor name2 github2 count2
    = if github1 == github2
      then Contributor name2 github2 (count1 `max` count2)
      else error $ printf "Cannot merge unrelated contributors '%s' and '%s'" github1 github2