{-# LANGUAGE OverloadedStrings #-}

module Network.Protocol.MusicBrainz.Utils (
    nameCreditsToArtistName
  , nameCreditsToArtistSortName
) where

import Control.Applicative ((<|>), liftA2)
import Data.Maybe (catMaybes)
import Data.Text (Text)
import qualified Data.Text as T

import Network.Protocol.MusicBrainz.Types

nameCreditsToArtistName :: [ArtistCredit] -> Text
nameCreditsToArtistName :: [ArtistCredit] -> Text
nameCreditsToArtistName = [Text] -> Text
T.concat ([Text] -> Text)
-> ([ArtistCredit] -> [Text]) -> [ArtistCredit] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArtistCredit -> Text) -> [ArtistCredit] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map ((ArtistCredit -> Maybe Text) -> ArtistCredit -> Text
nameSpan (Artist -> Maybe Text
_artistName (Artist -> Maybe Text)
-> (ArtistCredit -> Artist) -> ArtistCredit -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArtistCredit -> Artist
_artistCreditArtist))

nameCreditsToArtistSortName :: [ArtistCredit] -> Text
nameCreditsToArtistSortName :: [ArtistCredit] -> Text
nameCreditsToArtistSortName = [Text] -> Text
T.concat ([Text] -> Text)
-> ([ArtistCredit] -> [Text]) -> [ArtistCredit] -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ArtistCredit -> Text) -> [ArtistCredit] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
map ((ArtistCredit -> Maybe Text) -> ArtistCredit -> Text
nameSpan ((Maybe Text -> Maybe Text -> Maybe Text)
-> (Artist -> Maybe Text)
-> (Artist -> Maybe Text)
-> Artist
-> Maybe Text
forall a b c.
(a -> b -> c) -> (Artist -> a) -> (Artist -> b) -> Artist -> c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Maybe Text -> Maybe Text -> Maybe Text
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>) Artist -> Maybe Text
_artistSortName Artist -> Maybe Text
_artistName (Artist -> Maybe Text)
-> (ArtistCredit -> Artist) -> ArtistCredit -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArtistCredit -> Artist
_artistCreditArtist))

nameSpan :: (ArtistCredit -> Maybe Text) -> ArtistCredit -> Text
nameSpan :: (ArtistCredit -> Maybe Text) -> ArtistCredit -> Text
nameSpan ArtistCredit -> Maybe Text
f = [Text] -> Text
T.concat ([Text] -> Text)
-> (ArtistCredit -> [Text]) -> ArtistCredit -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Maybe Text] -> [Text]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe Text] -> [Text])
-> (ArtistCredit -> [Maybe Text]) -> ArtistCredit -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe Text -> [Maybe Text] -> [Maybe Text])
-> (ArtistCredit -> Maybe Text)
-> (ArtistCredit -> [Maybe Text])
-> ArtistCredit
-> [Maybe Text]
forall a b c.
(a -> b -> c)
-> (ArtistCredit -> a) -> (ArtistCredit -> b) -> ArtistCredit -> c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (:) ArtistCredit -> Maybe Text
f (Maybe Text -> [Maybe Text]
forall a. a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Text -> [Maybe Text])
-> (ArtistCredit -> Maybe Text) -> ArtistCredit -> [Maybe Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ArtistCredit -> Maybe Text
_artistCreditJoinPhrase)