{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}

module WikiMusic.Free.ArtistQuery
  ( ArtistQuery (..),
    fetchArtists,
    fetchArtistsByUUID,
    enrichedArtistResponse,
    fetchArtistComments,
    fetchArtistOpinions,
    fetchArtistArtworks,
    ArtistQueryError (..),
    searchArtists,
  )
where

import WikiMusic.Interaction.Model.Artist
import WikiMusic.Model.Artist
import WikiMusic.Model.Other
import WikiMusic.Protolude

data ArtistQueryError = PersistenceError Text | LogicError Text
  deriving (ArtistQueryError -> ArtistQueryError -> Bool
(ArtistQueryError -> ArtistQueryError -> Bool)
-> (ArtistQueryError -> ArtistQueryError -> Bool)
-> Eq ArtistQueryError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ArtistQueryError -> ArtistQueryError -> Bool
== :: ArtistQueryError -> ArtistQueryError -> Bool
$c/= :: ArtistQueryError -> ArtistQueryError -> Bool
/= :: ArtistQueryError -> ArtistQueryError -> Bool
Eq, Int -> ArtistQueryError -> ShowS
[ArtistQueryError] -> ShowS
ArtistQueryError -> String
(Int -> ArtistQueryError -> ShowS)
-> (ArtistQueryError -> String)
-> ([ArtistQueryError] -> ShowS)
-> Show ArtistQueryError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ArtistQueryError -> ShowS
showsPrec :: Int -> ArtistQueryError -> ShowS
$cshow :: ArtistQueryError -> String
show :: ArtistQueryError -> String
$cshowList :: [ArtistQueryError] -> ShowS
showList :: [ArtistQueryError] -> ShowS
Show)

type ArtistQuery :: Type -> Type
data ArtistQuery a
  = FetchArtists Env ArtistSortOrder Limit Offset ((Map UUID Artist, [UUID]) -> a)
  | FetchArtistsByUUID Env ArtistSortOrder [UUID] ((Map UUID Artist, [UUID]) -> a)
  | EnrichedArtistResponse Env (Map UUID Artist) EnrichArtistParams (Map UUID Artist -> a)
  | FetchArtistComments Env [UUID] (Map UUID ArtistComment -> a)
  | FetchArtistOpinions Env [UUID] (Map UUID ArtistOpinion -> a)
  | FetchArtistArtworks Env [UUID] (Map UUID ArtistArtwork -> a)
  | SearchArtists Env SearchInput ArtistSortOrder Limit Offset ((Map UUID Artist, [UUID]) -> a)
  deriving ((forall a b. (a -> b) -> ArtistQuery a -> ArtistQuery b)
-> (forall a b. a -> ArtistQuery b -> ArtistQuery a)
-> Functor ArtistQuery
forall a b. a -> ArtistQuery b -> ArtistQuery a
forall a b. (a -> b) -> ArtistQuery a -> ArtistQuery b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> ArtistQuery a -> ArtistQuery b
fmap :: forall a b. (a -> b) -> ArtistQuery a -> ArtistQuery b
$c<$ :: forall a b. a -> ArtistQuery b -> ArtistQuery a
<$ :: forall a b. a -> ArtistQuery b -> ArtistQuery a
Functor)

fetchArtists :: (ArtistQuery :<: f) => Env -> ArtistSortOrder -> Limit -> Offset -> Free f (Map UUID Artist, [UUID])
fetchArtists :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env
-> ArtistSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Artist, [UUID])
fetchArtists Env
env ArtistSortOrder
sortOrder Limit
limit Offset
offset = ArtistQuery (Free f (Map UUID Artist, [UUID]))
-> Free f (Map UUID Artist, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> ArtistSortOrder
-> Limit
-> Offset
-> ((Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID]))
-> ArtistQuery (Free f (Map UUID Artist, [UUID]))
forall a.
Env
-> ArtistSortOrder
-> Limit
-> Offset
-> ((Map UUID Artist, [UUID]) -> a)
-> ArtistQuery a
FetchArtists Env
env ArtistSortOrder
sortOrder Limit
limit Offset
offset (Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)

fetchArtistsByUUID :: (ArtistQuery :<: f) => Env -> ArtistSortOrder -> [UUID] -> Free f (Map UUID Artist, [UUID])
fetchArtistsByUUID :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env
-> ArtistSortOrder -> [UUID] -> Free f (Map UUID Artist, [UUID])
fetchArtistsByUUID Env
env ArtistSortOrder
sortOrder [UUID]
uuids = ArtistQuery (Free f (Map UUID Artist, [UUID]))
-> Free f (Map UUID Artist, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> ArtistSortOrder
-> [UUID]
-> ((Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID]))
-> ArtistQuery (Free f (Map UUID Artist, [UUID]))
forall a.
Env
-> ArtistSortOrder
-> [UUID]
-> ((Map UUID Artist, [UUID]) -> a)
-> ArtistQuery a
FetchArtistsByUUID Env
env ArtistSortOrder
sortOrder [UUID]
uuids (Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)

enrichedArtistResponse :: (ArtistQuery :<: f) => Env -> Map UUID Artist -> EnrichArtistParams -> Free f (Map UUID Artist)
enrichedArtistResponse :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env
-> Map UUID Artist
-> EnrichArtistParams
-> Free f (Map UUID Artist)
enrichedArtistResponse Env
env Map UUID Artist
artists EnrichArtistParams
enrichParams = ArtistQuery (Free f (Map UUID Artist)) -> Free f (Map UUID Artist)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> Map UUID Artist
-> EnrichArtistParams
-> (Map UUID Artist -> Free f (Map UUID Artist))
-> ArtistQuery (Free f (Map UUID Artist))
forall a.
Env
-> Map UUID Artist
-> EnrichArtistParams
-> (Map UUID Artist -> a)
-> ArtistQuery a
EnrichedArtistResponse Env
env Map UUID Artist
artists EnrichArtistParams
enrichParams Map UUID Artist -> Free f (Map UUID Artist)
forall (f :: * -> *) a. a -> Free f a
Pure)

fetchArtistComments :: (ArtistQuery :<: f) => Env -> [UUID] -> Free f (Map UUID ArtistComment)
fetchArtistComments :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID ArtistComment)
fetchArtistComments Env
env [UUID]
uuids = ArtistQuery (Free f (Map UUID ArtistComment))
-> Free f (Map UUID ArtistComment)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID ArtistComment -> Free f (Map UUID ArtistComment))
-> ArtistQuery (Free f (Map UUID ArtistComment))
forall a.
Env -> [UUID] -> (Map UUID ArtistComment -> a) -> ArtistQuery a
FetchArtistComments Env
env [UUID]
uuids Map UUID ArtistComment -> Free f (Map UUID ArtistComment)
forall (f :: * -> *) a. a -> Free f a
Pure)

fetchArtistOpinions :: (ArtistQuery :<: f) => Env -> [UUID] -> Free f (Map UUID ArtistOpinion)
fetchArtistOpinions :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID ArtistOpinion)
fetchArtistOpinions Env
env [UUID]
uuids = ArtistQuery (Free f (Map UUID ArtistOpinion))
-> Free f (Map UUID ArtistOpinion)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID ArtistOpinion -> Free f (Map UUID ArtistOpinion))
-> ArtistQuery (Free f (Map UUID ArtistOpinion))
forall a.
Env -> [UUID] -> (Map UUID ArtistOpinion -> a) -> ArtistQuery a
FetchArtistOpinions Env
env [UUID]
uuids Map UUID ArtistOpinion -> Free f (Map UUID ArtistOpinion)
forall (f :: * -> *) a. a -> Free f a
Pure)

fetchArtistArtworks :: (ArtistQuery :<: f) => Env -> [UUID] -> Free f (Map UUID ArtistArtwork)
fetchArtistArtworks :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID ArtistArtwork)
fetchArtistArtworks Env
env [UUID]
uuids = ArtistQuery (Free f (Map UUID ArtistArtwork))
-> Free f (Map UUID ArtistArtwork)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID ArtistArtwork -> Free f (Map UUID ArtistArtwork))
-> ArtistQuery (Free f (Map UUID ArtistArtwork))
forall a.
Env -> [UUID] -> (Map UUID ArtistArtwork -> a) -> ArtistQuery a
FetchArtistArtworks Env
env [UUID]
uuids Map UUID ArtistArtwork -> Free f (Map UUID ArtistArtwork)
forall (f :: * -> *) a. a -> Free f a
Pure)

searchArtists :: (ArtistQuery :<: f) => Env -> SearchInput -> ArtistSortOrder -> Limit -> Offset -> Free f (Map UUID Artist, [UUID])
searchArtists :: forall (f :: * -> *).
(ArtistQuery :<: f) =>
Env
-> SearchInput
-> ArtistSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Artist, [UUID])
searchArtists Env
env SearchInput
searchInput ArtistSortOrder
sortOrder Limit
limit Offset
offset = ArtistQuery (Free f (Map UUID Artist, [UUID]))
-> Free f (Map UUID Artist, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> SearchInput
-> ArtistSortOrder
-> Limit
-> Offset
-> ((Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID]))
-> ArtistQuery (Free f (Map UUID Artist, [UUID]))
forall a.
Env
-> SearchInput
-> ArtistSortOrder
-> Limit
-> Offset
-> ((Map UUID Artist, [UUID]) -> a)
-> ArtistQuery a
SearchArtists Env
env SearchInput
searchInput ArtistSortOrder
sortOrder Limit
limit Offset
offset (Map UUID Artist, [UUID]) -> Free f (Map UUID Artist, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)