{-# LANGUAGE OverloadedStrings #-}

module Network.Protocol.MusicBrainz.Types (
    MBID(..)
  , Release(..)
  , TextRepresentation(..)
  , Medium(..)
  , Track(..)
  , Recording(..)
  , ArtistCredit(..)
  , Artist(..)
  , ReleaseGroup(..)
  , LabelInfo(..)
  , Label(..)
  , ReleaseEvent(..)
  , Area(..)
  , ISO3166Code(..)
  , CoverArtArchive(..)
) where

import Data.Text (Text)
import Data.Time.Calendar (Day)
import Data.Vector (Vector)

import Control.Applicative ((<$>), (<*>))
import Control.Monad (mzero)
import Data.Aeson (FromJSON(..), (.:), (.:?), Value(..))
import Data.Maybe (fromMaybe)
import qualified Data.Text as T
import Data.Time.Format (parseTimeM)
import Data.Time.Locale.Compat (defaultTimeLocale)

newtype MBID = MBID { MBID -> Text
unMBID :: Text }
    deriving (MBID -> MBID -> Bool
(MBID -> MBID -> Bool) -> (MBID -> MBID -> Bool) -> Eq MBID
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MBID -> MBID -> Bool
== :: MBID -> MBID -> Bool
$c/= :: MBID -> MBID -> Bool
/= :: MBID -> MBID -> Bool
Eq, Int -> MBID -> ShowS
[MBID] -> ShowS
MBID -> String
(Int -> MBID -> ShowS)
-> (MBID -> String) -> ([MBID] -> ShowS) -> Show MBID
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MBID -> ShowS
showsPrec :: Int -> MBID -> ShowS
$cshow :: MBID -> String
show :: MBID -> String
$cshowList :: [MBID] -> ShowS
showList :: [MBID] -> ShowS
Show)

data Release = Release {
    Release -> MBID
_releaseId :: MBID
  , Release -> Text
_releaseTitle :: Text
  , Release -> Maybe Text
_releaseStatus :: Maybe Text
  , Release -> Maybe Text
_releaseQuality :: Maybe Text
  , Release -> Maybe Text
_releasePackaging :: Maybe Text
  , Release -> Maybe TextRepresentation
_releaseTextRepresentation :: Maybe TextRepresentation
  , Release -> [ArtistCredit]
_releaseArtistCredit :: [ArtistCredit]
  , Release -> Maybe Day
_releaseDate :: Maybe Day
  , Release -> Maybe Text
_releaseCountry :: Maybe Text
  , Release -> [ReleaseEvent]
_releaseEvents :: [ReleaseEvent]
  , Release -> Maybe Text
_releaseBarcode :: Maybe Text
  , Release -> Maybe Text
_releaseASIN :: Maybe Text
  , Release -> Maybe CoverArtArchive
_releaseCoverArtArchive :: Maybe CoverArtArchive
  , Release -> Vector Medium
_releaseMedia :: Vector Medium
} deriving (Release -> Release -> Bool
(Release -> Release -> Bool)
-> (Release -> Release -> Bool) -> Eq Release
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Release -> Release -> Bool
== :: Release -> Release -> Bool
$c/= :: Release -> Release -> Bool
/= :: Release -> Release -> Bool
Eq, Int -> Release -> ShowS
[Release] -> ShowS
Release -> String
(Int -> Release -> ShowS)
-> (Release -> String) -> ([Release] -> ShowS) -> Show Release
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Release -> ShowS
showsPrec :: Int -> Release -> ShowS
$cshow :: Release -> String
show :: Release -> String
$cshowList :: [Release] -> ShowS
showList :: [Release] -> ShowS
Show)

instance FromJSON Release where
    parseJSON :: Value -> Parser Release
parseJSON (Object Object
v) = MBID
-> Text
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> Maybe TextRepresentation
-> [ArtistCredit]
-> Maybe Day
-> Maybe Text
-> [ReleaseEvent]
-> Maybe Text
-> Maybe Text
-> Maybe CoverArtArchive
-> Vector Medium
-> Release
Release (MBID
 -> Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe Text
 -> Maybe TextRepresentation
 -> [ArtistCredit]
 -> Maybe Day
 -> Maybe Text
 -> [ReleaseEvent]
 -> Maybe Text
 -> Maybe Text
 -> Maybe CoverArtArchive
 -> Vector Medium
 -> Release)
-> Parser MBID
-> Parser
     (Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe TextRepresentation
      -> [ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 (Text -> MBID
MBID (Text -> MBID) -> Parser Text -> Parser MBID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id") Parser
  (Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe TextRepresentation
   -> [ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser Text
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe Text
      -> Maybe TextRepresentation
      -> [ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"title" Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe Text
   -> Maybe TextRepresentation
   -> [ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe Text
      -> Maybe TextRepresentation
      -> [ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"status" Parser
  (Maybe Text
   -> Maybe Text
   -> Maybe TextRepresentation
   -> [ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> Maybe TextRepresentation
      -> [ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"quality" Parser
  (Maybe Text
   -> Maybe TextRepresentation
   -> [ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe Text)
-> Parser
     (Maybe TextRepresentation
      -> [ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"packaging" Parser
  (Maybe TextRepresentation
   -> [ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe TextRepresentation)
-> Parser
     ([ArtistCredit]
      -> Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe TextRepresentation)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"text-representation" Parser
  ([ArtistCredit]
   -> Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser [ArtistCredit]
-> Parser
     (Maybe Day
      -> Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser [ArtistCredit]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"artist-credit" Parser
  (Maybe Day
   -> Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe Day)
-> Parser
     (Maybe Text
      -> [ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 ((Bool -> TimeLocale -> String -> String -> Maybe Day
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale String
"%Y-%m-%d" (String -> Maybe Day) -> (Text -> String) -> Text -> Maybe Day
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> Maybe Day) -> Maybe Text -> Maybe Day
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe Text -> Maybe Day)
-> Parser (Maybe Text) -> Parser (Maybe Day)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"date") Parser
  (Maybe Text
   -> [ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser (Maybe Text)
-> Parser
     ([ReleaseEvent]
      -> Maybe Text
      -> Maybe Text
      -> Maybe CoverArtArchive
      -> Vector Medium
      -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"country" Parser
  ([ReleaseEvent]
   -> Maybe Text
   -> Maybe Text
   -> Maybe CoverArtArchive
   -> Vector Medium
   -> Release)
-> Parser [ReleaseEvent]
-> Parser
     (Maybe Text
      -> Maybe Text -> Maybe CoverArtArchive -> Vector Medium -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser [ReleaseEvent]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"release-events" Parser
  (Maybe Text
   -> Maybe Text -> Maybe CoverArtArchive -> Vector Medium -> Release)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text -> Maybe CoverArtArchive -> Vector Medium -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"barcode" Parser
  (Maybe Text -> Maybe CoverArtArchive -> Vector Medium -> Release)
-> Parser (Maybe Text)
-> Parser (Maybe CoverArtArchive -> Vector Medium -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"asin" Parser (Maybe CoverArtArchive -> Vector Medium -> Release)
-> Parser (Maybe CoverArtArchive)
-> Parser (Vector Medium -> Release)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe CoverArtArchive)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"cover-art-archive" Parser (Vector Medium -> Release)
-> Parser (Vector Medium) -> Parser Release
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Vector Medium)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"media"
    parseJSON Value
_          = Parser Release
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data TextRepresentation = TextRepresentation {
    TextRepresentation -> Maybe Text
_textRepLanguage :: Maybe Text
  , TextRepresentation -> Maybe Text
_textRepScript :: Maybe Text
} deriving (TextRepresentation -> TextRepresentation -> Bool
(TextRepresentation -> TextRepresentation -> Bool)
-> (TextRepresentation -> TextRepresentation -> Bool)
-> Eq TextRepresentation
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TextRepresentation -> TextRepresentation -> Bool
== :: TextRepresentation -> TextRepresentation -> Bool
$c/= :: TextRepresentation -> TextRepresentation -> Bool
/= :: TextRepresentation -> TextRepresentation -> Bool
Eq, Int -> TextRepresentation -> ShowS
[TextRepresentation] -> ShowS
TextRepresentation -> String
(Int -> TextRepresentation -> ShowS)
-> (TextRepresentation -> String)
-> ([TextRepresentation] -> ShowS)
-> Show TextRepresentation
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TextRepresentation -> ShowS
showsPrec :: Int -> TextRepresentation -> ShowS
$cshow :: TextRepresentation -> String
show :: TextRepresentation -> String
$cshowList :: [TextRepresentation] -> ShowS
showList :: [TextRepresentation] -> ShowS
Show)

instance FromJSON TextRepresentation where
    parseJSON :: Value -> Parser TextRepresentation
parseJSON (Object Object
v) = Maybe Text -> Maybe Text -> TextRepresentation
TextRepresentation (Maybe Text -> Maybe Text -> TextRepresentation)
-> Parser (Maybe Text) -> Parser (Maybe Text -> TextRepresentation)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"language" Parser (Maybe Text -> TextRepresentation)
-> Parser (Maybe Text) -> Parser TextRepresentation
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"script"
    parseJSON Value
_          = Parser TextRepresentation
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Medium = Medium {
    Medium -> Maybe Text
_mediumTitle :: Maybe Text
  , Medium -> Maybe Integer
_mediumPosition :: Maybe Integer
  , Medium -> Maybe Text
_mediumFormat :: Maybe Text
  , Medium -> Integer
_mediumTrackCount :: Integer
  , Medium -> Maybe Integer
_mediumTrackOffset :: Maybe Integer
  , Medium -> Maybe [Track]
_mediumTrackList :: Maybe [Track]
} deriving (Medium -> Medium -> Bool
(Medium -> Medium -> Bool)
-> (Medium -> Medium -> Bool) -> Eq Medium
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Medium -> Medium -> Bool
== :: Medium -> Medium -> Bool
$c/= :: Medium -> Medium -> Bool
/= :: Medium -> Medium -> Bool
Eq, Int -> Medium -> ShowS
[Medium] -> ShowS
Medium -> String
(Int -> Medium -> ShowS)
-> (Medium -> String) -> ([Medium] -> ShowS) -> Show Medium
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Medium -> ShowS
showsPrec :: Int -> Medium -> ShowS
$cshow :: Medium -> String
show :: Medium -> String
$cshowList :: [Medium] -> ShowS
showList :: [Medium] -> ShowS
Show)

instance FromJSON Medium where
    parseJSON :: Value -> Parser Medium
parseJSON (Object Object
v) = Maybe Text
-> Maybe Integer
-> Maybe Text
-> Integer
-> Maybe Integer
-> Maybe [Track]
-> Medium
Medium (Maybe Text
 -> Maybe Integer
 -> Maybe Text
 -> Integer
 -> Maybe Integer
 -> Maybe [Track]
 -> Medium)
-> Parser (Maybe Text)
-> Parser
     (Maybe Integer
      -> Maybe Text
      -> Integer
      -> Maybe Integer
      -> Maybe [Track]
      -> Medium)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"title" Parser
  (Maybe Integer
   -> Maybe Text
   -> Integer
   -> Maybe Integer
   -> Maybe [Track]
   -> Medium)
-> Parser (Maybe Integer)
-> Parser
     (Maybe Text -> Integer -> Maybe Integer -> Maybe [Track] -> Medium)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"position" Parser
  (Maybe Text -> Integer -> Maybe Integer -> Maybe [Track] -> Medium)
-> Parser (Maybe Text)
-> Parser (Integer -> Maybe Integer -> Maybe [Track] -> Medium)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"format" Parser (Integer -> Maybe Integer -> Maybe [Track] -> Medium)
-> Parser Integer
-> Parser (Maybe Integer -> Maybe [Track] -> Medium)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.:  Key
"track-count" Parser (Maybe Integer -> Maybe [Track] -> Medium)
-> Parser (Maybe Integer) -> Parser (Maybe [Track] -> Medium)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"track-offset" Parser (Maybe [Track] -> Medium)
-> Parser (Maybe [Track]) -> Parser Medium
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe [Track])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"tracks"
    parseJSON Value
_          = Parser Medium
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Track = Track {
    Track -> MBID
_trackId :: MBID
  , Track -> [ArtistCredit]
_trackArtistCredit :: [ArtistCredit]
  , Track -> Maybe Integer
_trackPosition :: Maybe Integer
  , Track -> Maybe Text
_trackNumber :: Maybe Text
  , Track -> Maybe Integer
_trackLength :: Maybe Integer
  , Track -> Recording
_trackRecording :: Recording
} deriving (Track -> Track -> Bool
(Track -> Track -> Bool) -> (Track -> Track -> Bool) -> Eq Track
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Track -> Track -> Bool
== :: Track -> Track -> Bool
$c/= :: Track -> Track -> Bool
/= :: Track -> Track -> Bool
Eq, Int -> Track -> ShowS
[Track] -> ShowS
Track -> String
(Int -> Track -> ShowS)
-> (Track -> String) -> ([Track] -> ShowS) -> Show Track
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Track -> ShowS
showsPrec :: Int -> Track -> ShowS
$cshow :: Track -> String
show :: Track -> String
$cshowList :: [Track] -> ShowS
showList :: [Track] -> ShowS
Show)

instance FromJSON Track where
    parseJSON :: Value -> Parser Track
parseJSON (Object Object
v) = MBID
-> [ArtistCredit]
-> Maybe Integer
-> Maybe Text
-> Maybe Integer
-> Recording
-> Track
Track (MBID
 -> [ArtistCredit]
 -> Maybe Integer
 -> Maybe Text
 -> Maybe Integer
 -> Recording
 -> Track)
-> Parser MBID
-> Parser
     ([ArtistCredit]
      -> Maybe Integer
      -> Maybe Text
      -> Maybe Integer
      -> Recording
      -> Track)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 (Text -> MBID
MBID (Text -> MBID) -> Parser Text -> Parser MBID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id") Parser
  ([ArtistCredit]
   -> Maybe Integer
   -> Maybe Text
   -> Maybe Integer
   -> Recording
   -> Track)
-> Parser [ArtistCredit]
-> Parser
     (Maybe Integer
      -> Maybe Text -> Maybe Integer -> Recording -> Track)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser [ArtistCredit]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"artist-credit" Parser
  (Maybe Integer
   -> Maybe Text -> Maybe Integer -> Recording -> Track)
-> Parser (Maybe Integer)
-> Parser (Maybe Text -> Maybe Integer -> Recording -> Track)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"position" Parser (Maybe Text -> Maybe Integer -> Recording -> Track)
-> Parser (Maybe Text)
-> Parser (Maybe Integer -> Recording -> Track)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"number" Parser (Maybe Integer -> Recording -> Track)
-> Parser (Maybe Integer) -> Parser (Recording -> Track)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"length" Parser (Recording -> Track) -> Parser Recording -> Parser Track
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser Recording
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"recording"
    parseJSON Value
_          = Parser Track
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Recording = Recording {
    Recording -> MBID
_recordingId :: MBID
  , Recording -> Maybe Text
_recordingTitle :: Maybe Text
  , Recording -> Maybe Integer
_recordingLength :: Maybe Integer
  , Recording -> [ArtistCredit]
_recordingArtistCredit :: [ArtistCredit]
} deriving (Recording -> Recording -> Bool
(Recording -> Recording -> Bool)
-> (Recording -> Recording -> Bool) -> Eq Recording
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Recording -> Recording -> Bool
== :: Recording -> Recording -> Bool
$c/= :: Recording -> Recording -> Bool
/= :: Recording -> Recording -> Bool
Eq, Int -> Recording -> ShowS
[Recording] -> ShowS
Recording -> String
(Int -> Recording -> ShowS)
-> (Recording -> String)
-> ([Recording] -> ShowS)
-> Show Recording
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Recording -> ShowS
showsPrec :: Int -> Recording -> ShowS
$cshow :: Recording -> String
show :: Recording -> String
$cshowList :: [Recording] -> ShowS
showList :: [Recording] -> ShowS
Show)

instance FromJSON Recording where
    parseJSON :: Value -> Parser Recording
parseJSON (Object Object
v) = MBID -> Maybe Text -> Maybe Integer -> [ArtistCredit] -> Recording
Recording (MBID
 -> Maybe Text -> Maybe Integer -> [ArtistCredit] -> Recording)
-> Parser MBID
-> Parser
     (Maybe Text -> Maybe Integer -> [ArtistCredit] -> Recording)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 (Text -> MBID
MBID (Text -> MBID) -> Parser Text -> Parser MBID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id") Parser (Maybe Text -> Maybe Integer -> [ArtistCredit] -> Recording)
-> Parser (Maybe Text)
-> Parser (Maybe Integer -> [ArtistCredit] -> Recording)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"title" Parser (Maybe Integer -> [ArtistCredit] -> Recording)
-> Parser (Maybe Integer) -> Parser ([ArtistCredit] -> Recording)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"length" Parser ([ArtistCredit] -> Recording)
-> Parser [ArtistCredit] -> Parser Recording
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser [ArtistCredit]
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"artist-credit"
    parseJSON Value
_          = Parser Recording
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data ArtistCredit = ArtistCredit {
    ArtistCredit -> Artist
_artistCreditArtist :: Artist
  , ArtistCredit -> Maybe Text
_artistCreditJoinPhrase :: Maybe Text
  , ArtistCredit -> Maybe Text
_artistCreditName :: Maybe Text
} deriving (ArtistCredit -> ArtistCredit -> Bool
(ArtistCredit -> ArtistCredit -> Bool)
-> (ArtistCredit -> ArtistCredit -> Bool) -> Eq ArtistCredit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ArtistCredit -> ArtistCredit -> Bool
== :: ArtistCredit -> ArtistCredit -> Bool
$c/= :: ArtistCredit -> ArtistCredit -> Bool
/= :: ArtistCredit -> ArtistCredit -> Bool
Eq, Int -> ArtistCredit -> ShowS
[ArtistCredit] -> ShowS
ArtistCredit -> String
(Int -> ArtistCredit -> ShowS)
-> (ArtistCredit -> String)
-> ([ArtistCredit] -> ShowS)
-> Show ArtistCredit
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ArtistCredit -> ShowS
showsPrec :: Int -> ArtistCredit -> ShowS
$cshow :: ArtistCredit -> String
show :: ArtistCredit -> String
$cshowList :: [ArtistCredit] -> ShowS
showList :: [ArtistCredit] -> ShowS
Show)

instance FromJSON ArtistCredit where
    parseJSON :: Value -> Parser ArtistCredit
parseJSON (Object Object
v) = Artist -> Maybe Text -> Maybe Text -> ArtistCredit
ArtistCredit (Artist -> Maybe Text -> Maybe Text -> ArtistCredit)
-> Parser Artist
-> Parser (Maybe Text -> Maybe Text -> ArtistCredit)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 Object
v Object -> Key -> Parser Artist
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"artist" Parser (Maybe Text -> Maybe Text -> ArtistCredit)
-> Parser (Maybe Text) -> Parser (Maybe Text -> ArtistCredit)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"joinphrase" Parser (Maybe Text -> ArtistCredit)
-> Parser (Maybe Text) -> Parser ArtistCredit
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name"
    parseJSON Value
_          = Parser ArtistCredit
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Artist = Artist {
    Artist -> MBID
_artistId :: MBID
  , Artist -> Maybe Text
_artistName :: Maybe Text
  , Artist -> Maybe Text
_artistSortName :: Maybe Text
  , Artist -> Maybe Text
_artistDisambiguation :: Maybe Text
} deriving (Artist -> Artist -> Bool
(Artist -> Artist -> Bool)
-> (Artist -> Artist -> Bool) -> Eq Artist
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Artist -> Artist -> Bool
== :: Artist -> Artist -> Bool
$c/= :: Artist -> Artist -> Bool
/= :: Artist -> Artist -> Bool
Eq, Int -> Artist -> ShowS
[Artist] -> ShowS
Artist -> String
(Int -> Artist -> ShowS)
-> (Artist -> String) -> ([Artist] -> ShowS) -> Show Artist
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Artist -> ShowS
showsPrec :: Int -> Artist -> ShowS
$cshow :: Artist -> String
show :: Artist -> String
$cshowList :: [Artist] -> ShowS
showList :: [Artist] -> ShowS
Show)

instance FromJSON Artist where
    parseJSON :: Value -> Parser Artist
parseJSON (Object Object
v) = MBID -> Maybe Text -> Maybe Text -> Maybe Text -> Artist
Artist (MBID -> Maybe Text -> Maybe Text -> Maybe Text -> Artist)
-> Parser MBID
-> Parser (Maybe Text -> Maybe Text -> Maybe Text -> Artist)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 (Text -> MBID
MBID (Text -> MBID) -> Parser Text -> Parser MBID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id") Parser (Maybe Text -> Maybe Text -> Maybe Text -> Artist)
-> Parser (Maybe Text)
-> Parser (Maybe Text -> Maybe Text -> Artist)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name" Parser (Maybe Text -> Maybe Text -> Artist)
-> Parser (Maybe Text) -> Parser (Maybe Text -> Artist)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sort-name" Parser (Maybe Text -> Artist)
-> Parser (Maybe Text) -> Parser Artist
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"disambiguation"
    parseJSON Value
_          = Parser Artist
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data ReleaseGroup = ReleaseGroup {
    ReleaseGroup -> MBID
_releaseGroupId :: MBID
  , ReleaseGroup -> Text
_releaseGroupType :: Text
  , ReleaseGroup -> Maybe Text
_releaseGroupTitle :: Maybe Text
  , ReleaseGroup -> Maybe Text
_releaseGroupFirstReleaseDate :: Maybe Text
  , ReleaseGroup -> Maybe Text
_releaseGroupPrimaryType :: Maybe Text
  , ReleaseGroup -> [ArtistCredit]
_releaseGroupArtistCredit :: [ArtistCredit]
} deriving (ReleaseGroup -> ReleaseGroup -> Bool
(ReleaseGroup -> ReleaseGroup -> Bool)
-> (ReleaseGroup -> ReleaseGroup -> Bool) -> Eq ReleaseGroup
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReleaseGroup -> ReleaseGroup -> Bool
== :: ReleaseGroup -> ReleaseGroup -> Bool
$c/= :: ReleaseGroup -> ReleaseGroup -> Bool
/= :: ReleaseGroup -> ReleaseGroup -> Bool
Eq, Int -> ReleaseGroup -> ShowS
[ReleaseGroup] -> ShowS
ReleaseGroup -> String
(Int -> ReleaseGroup -> ShowS)
-> (ReleaseGroup -> String)
-> ([ReleaseGroup] -> ShowS)
-> Show ReleaseGroup
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReleaseGroup -> ShowS
showsPrec :: Int -> ReleaseGroup -> ShowS
$cshow :: ReleaseGroup -> String
show :: ReleaseGroup -> String
$cshowList :: [ReleaseGroup] -> ShowS
showList :: [ReleaseGroup] -> ShowS
Show)

data LabelInfo = LabelInfo {
    LabelInfo -> Maybe Text
_labelInfoCatalogNumber :: Maybe Text
  , LabelInfo -> Label
_labelInfoLabel :: Label
} deriving (LabelInfo -> LabelInfo -> Bool
(LabelInfo -> LabelInfo -> Bool)
-> (LabelInfo -> LabelInfo -> Bool) -> Eq LabelInfo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: LabelInfo -> LabelInfo -> Bool
== :: LabelInfo -> LabelInfo -> Bool
$c/= :: LabelInfo -> LabelInfo -> Bool
/= :: LabelInfo -> LabelInfo -> Bool
Eq, Int -> LabelInfo -> ShowS
[LabelInfo] -> ShowS
LabelInfo -> String
(Int -> LabelInfo -> ShowS)
-> (LabelInfo -> String)
-> ([LabelInfo] -> ShowS)
-> Show LabelInfo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LabelInfo -> ShowS
showsPrec :: Int -> LabelInfo -> ShowS
$cshow :: LabelInfo -> String
show :: LabelInfo -> String
$cshowList :: [LabelInfo] -> ShowS
showList :: [LabelInfo] -> ShowS
Show)

data Label = Label {
    Label -> MBID
_labelId :: MBID
  , Label -> Maybe Text
_labelName :: Maybe Text
  , Label -> Maybe Text
_labelSortName :: Maybe Text
  , Label -> Maybe Text
_labelLabelCode :: Maybe Text
} deriving (Label -> Label -> Bool
(Label -> Label -> Bool) -> (Label -> Label -> Bool) -> Eq Label
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Label -> Label -> Bool
== :: Label -> Label -> Bool
$c/= :: Label -> Label -> Bool
/= :: Label -> Label -> Bool
Eq, Int -> Label -> ShowS
[Label] -> ShowS
Label -> String
(Int -> Label -> ShowS)
-> (Label -> String) -> ([Label] -> ShowS) -> Show Label
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Label -> ShowS
showsPrec :: Int -> Label -> ShowS
$cshow :: Label -> String
show :: Label -> String
$cshowList :: [Label] -> ShowS
showList :: [Label] -> ShowS
Show)

data ReleaseEvent = ReleaseEvent {
    ReleaseEvent -> Maybe Day
_releaseEventDate :: Maybe Day
  , ReleaseEvent -> Maybe Area
_releaseEventArea :: Maybe Area
} deriving (ReleaseEvent -> ReleaseEvent -> Bool
(ReleaseEvent -> ReleaseEvent -> Bool)
-> (ReleaseEvent -> ReleaseEvent -> Bool) -> Eq ReleaseEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ReleaseEvent -> ReleaseEvent -> Bool
== :: ReleaseEvent -> ReleaseEvent -> Bool
$c/= :: ReleaseEvent -> ReleaseEvent -> Bool
/= :: ReleaseEvent -> ReleaseEvent -> Bool
Eq, Int -> ReleaseEvent -> ShowS
[ReleaseEvent] -> ShowS
ReleaseEvent -> String
(Int -> ReleaseEvent -> ShowS)
-> (ReleaseEvent -> String)
-> ([ReleaseEvent] -> ShowS)
-> Show ReleaseEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ReleaseEvent -> ShowS
showsPrec :: Int -> ReleaseEvent -> ShowS
$cshow :: ReleaseEvent -> String
show :: ReleaseEvent -> String
$cshowList :: [ReleaseEvent] -> ShowS
showList :: [ReleaseEvent] -> ShowS
Show)

instance FromJSON ReleaseEvent where
    parseJSON :: Value -> Parser ReleaseEvent
parseJSON (Object Object
v) = Maybe Day -> Maybe Area -> ReleaseEvent
ReleaseEvent (Maybe Day -> Maybe Area -> ReleaseEvent)
-> Parser (Maybe Day) -> Parser (Maybe Area -> ReleaseEvent)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 ((Bool -> TimeLocale -> String -> String -> Maybe Day
forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale String
"%Y-%m-%d" (String -> Maybe Day) -> (Text -> String) -> Text -> Maybe Day
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> Maybe Day) -> Maybe Text -> Maybe Day
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<) (Maybe Text -> Maybe Day)
-> Parser (Maybe Text) -> Parser (Maybe Day)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"date") Parser (Maybe Area -> ReleaseEvent)
-> Parser (Maybe Area) -> Parser ReleaseEvent
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Area)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"area"
    parseJSON Value
_          = Parser ReleaseEvent
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data Area = Area {
    Area -> MBID
_areaId :: MBID
  , Area -> Maybe Text
_areaName :: Maybe Text
  , Area -> Maybe Text
_areaSortName :: Maybe Text
  , Area -> [ISO3166Code]
_areaISO3166_1Codes :: [ISO3166Code]
  , Area -> [ISO3166Code]
_areaISO3166_2Codes :: [ISO3166Code]
  , Area -> [ISO3166Code]
_areaISO3166_3Codes :: [ISO3166Code]
} deriving (Area -> Area -> Bool
(Area -> Area -> Bool) -> (Area -> Area -> Bool) -> Eq Area
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Area -> Area -> Bool
== :: Area -> Area -> Bool
$c/= :: Area -> Area -> Bool
/= :: Area -> Area -> Bool
Eq, Int -> Area -> ShowS
[Area] -> ShowS
Area -> String
(Int -> Area -> ShowS)
-> (Area -> String) -> ([Area] -> ShowS) -> Show Area
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Area -> ShowS
showsPrec :: Int -> Area -> ShowS
$cshow :: Area -> String
show :: Area -> String
$cshowList :: [Area] -> ShowS
showList :: [Area] -> ShowS
Show)

instance FromJSON Area where
    parseJSON :: Value -> Parser Area
parseJSON (Object Object
v) = MBID
-> Maybe Text
-> Maybe Text
-> [ISO3166Code]
-> [ISO3166Code]
-> [ISO3166Code]
-> Area
Area (MBID
 -> Maybe Text
 -> Maybe Text
 -> [ISO3166Code]
 -> [ISO3166Code]
 -> [ISO3166Code]
 -> Area)
-> Parser MBID
-> Parser
     (Maybe Text
      -> Maybe Text
      -> [ISO3166Code]
      -> [ISO3166Code]
      -> [ISO3166Code]
      -> Area)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 (Text -> MBID
MBID (Text -> MBID) -> Parser Text -> Parser MBID
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"id") Parser
  (Maybe Text
   -> Maybe Text
   -> [ISO3166Code]
   -> [ISO3166Code]
   -> [ISO3166Code]
   -> Area)
-> Parser (Maybe Text)
-> Parser
     (Maybe Text
      -> [ISO3166Code] -> [ISO3166Code] -> [ISO3166Code] -> Area)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"name" Parser
  (Maybe Text
   -> [ISO3166Code] -> [ISO3166Code] -> [ISO3166Code] -> Area)
-> Parser (Maybe Text)
-> Parser ([ISO3166Code] -> [ISO3166Code] -> [ISO3166Code] -> Area)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"sort-name" Parser ([ISO3166Code] -> [ISO3166Code] -> [ISO3166Code] -> Area)
-> Parser [ISO3166Code]
-> Parser ([ISO3166Code] -> [ISO3166Code] -> Area)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 ([ISO3166Code] -> Maybe [ISO3166Code] -> [ISO3166Code]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [ISO3166Code] -> [ISO3166Code])
-> Parser (Maybe [ISO3166Code]) -> Parser [ISO3166Code]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe [ISO3166Code])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"iso_3166_1_codes") Parser ([ISO3166Code] -> [ISO3166Code] -> Area)
-> Parser [ISO3166Code] -> Parser ([ISO3166Code] -> Area)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 ([ISO3166Code] -> Maybe [ISO3166Code] -> [ISO3166Code]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [ISO3166Code] -> [ISO3166Code])
-> Parser (Maybe [ISO3166Code]) -> Parser [ISO3166Code]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe [ISO3166Code])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"iso_3166_2_codes") Parser ([ISO3166Code] -> Area)
-> Parser [ISO3166Code] -> Parser Area
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 ([ISO3166Code] -> Maybe [ISO3166Code] -> [ISO3166Code]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [ISO3166Code] -> [ISO3166Code])
-> Parser (Maybe [ISO3166Code]) -> Parser [ISO3166Code]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
v Object -> Key -> Parser (Maybe [ISO3166Code])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"iso_3166_3_codes")
    parseJSON Value
_          = Parser Area
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

data CoverArtArchive = CoverArtArchive {
    CoverArtArchive -> Maybe Bool
_coverArtArchiveArtwork :: Maybe Bool
  , CoverArtArchive -> Maybe Integer
_coverArtArchiveCount :: Maybe Integer
  , CoverArtArchive -> Maybe Bool
_coverArtArchiveFront :: Maybe Bool
  , CoverArtArchive -> Maybe Bool
_coverArtArchiveBack :: Maybe Bool
} deriving (CoverArtArchive -> CoverArtArchive -> Bool
(CoverArtArchive -> CoverArtArchive -> Bool)
-> (CoverArtArchive -> CoverArtArchive -> Bool)
-> Eq CoverArtArchive
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CoverArtArchive -> CoverArtArchive -> Bool
== :: CoverArtArchive -> CoverArtArchive -> Bool
$c/= :: CoverArtArchive -> CoverArtArchive -> Bool
/= :: CoverArtArchive -> CoverArtArchive -> Bool
Eq, Int -> CoverArtArchive -> ShowS
[CoverArtArchive] -> ShowS
CoverArtArchive -> String
(Int -> CoverArtArchive -> ShowS)
-> (CoverArtArchive -> String)
-> ([CoverArtArchive] -> ShowS)
-> Show CoverArtArchive
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CoverArtArchive -> ShowS
showsPrec :: Int -> CoverArtArchive -> ShowS
$cshow :: CoverArtArchive -> String
show :: CoverArtArchive -> String
$cshowList :: [CoverArtArchive] -> ShowS
showList :: [CoverArtArchive] -> ShowS
Show)

instance FromJSON CoverArtArchive where
    parseJSON :: Value -> Parser CoverArtArchive
parseJSON (Object Object
v) = Maybe Bool
-> Maybe Integer -> Maybe Bool -> Maybe Bool -> CoverArtArchive
CoverArtArchive (Maybe Bool
 -> Maybe Integer -> Maybe Bool -> Maybe Bool -> CoverArtArchive)
-> Parser (Maybe Bool)
-> Parser
     (Maybe Integer -> Maybe Bool -> Maybe Bool -> CoverArtArchive)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
                                 Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"artwork" Parser
  (Maybe Integer -> Maybe Bool -> Maybe Bool -> CoverArtArchive)
-> Parser (Maybe Integer)
-> Parser (Maybe Bool -> Maybe Bool -> CoverArtArchive)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Integer)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"count" Parser (Maybe Bool -> Maybe Bool -> CoverArtArchive)
-> Parser (Maybe Bool) -> Parser (Maybe Bool -> CoverArtArchive)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"front" Parser (Maybe Bool -> CoverArtArchive)
-> Parser (Maybe Bool) -> Parser CoverArtArchive
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
                                 Object
v Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"back"
    parseJSON Value
_          = Parser CoverArtArchive
forall a. Parser a
forall (m :: * -> *) a. MonadPlus m => m a
mzero

newtype ISO3166Code = ISO3166Code { ISO3166Code -> Text
unISO3166Code :: Text }
    deriving (ISO3166Code -> ISO3166Code -> Bool
(ISO3166Code -> ISO3166Code -> Bool)
-> (ISO3166Code -> ISO3166Code -> Bool) -> Eq ISO3166Code
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ISO3166Code -> ISO3166Code -> Bool
== :: ISO3166Code -> ISO3166Code -> Bool
$c/= :: ISO3166Code -> ISO3166Code -> Bool
/= :: ISO3166Code -> ISO3166Code -> Bool
Eq, Int -> ISO3166Code -> ShowS
[ISO3166Code] -> ShowS
ISO3166Code -> String
(Int -> ISO3166Code -> ShowS)
-> (ISO3166Code -> String)
-> ([ISO3166Code] -> ShowS)
-> Show ISO3166Code
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ISO3166Code -> ShowS
showsPrec :: Int -> ISO3166Code -> ShowS
$cshow :: ISO3166Code -> String
show :: ISO3166Code -> String
$cshowList :: [ISO3166Code] -> ShowS
showList :: [ISO3166Code] -> ShowS
Show)

instance FromJSON ISO3166Code where
    parseJSON :: Value -> Parser ISO3166Code
parseJSON Value
t = Text -> ISO3166Code
ISO3166Code (Text -> ISO3166Code) -> Parser Text -> Parser ISO3166Code
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value -> Parser Text
forall a. FromJSON a => Value -> Parser a
parseJSON Value
t