{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE NoFieldSelectors #-}
module WikiMusic.Free.SongQuery
( SongQuery (..),
fetchSongs,
fetchSongsByUUID,
enrichedSongResponse,
fetchSongComments,
fetchSongOpinions,
fetchSongArtworks,
SongQueryError (..),
searchSongs,
fetchSongContents,
fetchSongArtists,
)
where
import Free.AlaCarte
import WikiMusic.Interaction.Model.Song
import WikiMusic.Model.Other
import WikiMusic.Model.Song
import WikiMusic.Protolude
data SongQueryError = PersistenceError Text | LogicError Text
deriving (SongQueryError -> SongQueryError -> Bool
(SongQueryError -> SongQueryError -> Bool)
-> (SongQueryError -> SongQueryError -> Bool) -> Eq SongQueryError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SongQueryError -> SongQueryError -> Bool
== :: SongQueryError -> SongQueryError -> Bool
$c/= :: SongQueryError -> SongQueryError -> Bool
/= :: SongQueryError -> SongQueryError -> Bool
Eq, Int -> SongQueryError -> ShowS
[SongQueryError] -> ShowS
SongQueryError -> String
(Int -> SongQueryError -> ShowS)
-> (SongQueryError -> String)
-> ([SongQueryError] -> ShowS)
-> Show SongQueryError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SongQueryError -> ShowS
showsPrec :: Int -> SongQueryError -> ShowS
$cshow :: SongQueryError -> String
show :: SongQueryError -> String
$cshowList :: [SongQueryError] -> ShowS
showList :: [SongQueryError] -> ShowS
Show)
type SongQuery :: Type -> Type
data SongQuery a
= FetchSongs Env SongSortOrder Limit Offset ((Map UUID Song, [UUID]) -> a)
| FetchSongsByUUID Env SongSortOrder [UUID] ((Map UUID Song, [UUID]) -> a)
| EnrichedSongResponse Env (Map UUID Song) EnrichSongParams (Map UUID Song -> a)
| Env [UUID] (Map UUID SongComment -> a)
| FetchSongOpinions Env [UUID] (Map UUID SongOpinion -> a)
| FetchSongArtworks Env [UUID] (Map UUID SongArtwork -> a)
| FetchSongContents Env [UUID] (Map UUID SongContent -> a)
| FetchSongArtists Env [UUID] ([(UUID, UUID, Text)] -> a)
| SearchSongs Env SearchInput SongSortOrder Limit Offset ((Map UUID Song, [UUID]) -> a)
deriving ((forall a b. (a -> b) -> SongQuery a -> SongQuery b)
-> (forall a b. a -> SongQuery b -> SongQuery a)
-> Functor SongQuery
forall a b. a -> SongQuery b -> SongQuery a
forall a b. (a -> b) -> SongQuery a -> SongQuery 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) -> SongQuery a -> SongQuery b
fmap :: forall a b. (a -> b) -> SongQuery a -> SongQuery b
$c<$ :: forall a b. a -> SongQuery b -> SongQuery a
<$ :: forall a b. a -> SongQuery b -> SongQuery a
Functor)
fetchSongs :: (SongQuery :<: f) => Env -> SongSortOrder -> Limit -> Offset -> Free f (Map UUID Song, [UUID])
fetchSongs :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env
-> SongSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Song, [UUID])
fetchSongs Env
env SongSortOrder
sortOrder Limit
fetchLimit Offset
offset = SongQuery (Free f (Map UUID Song, [UUID]))
-> Free f (Map UUID Song, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> SongSortOrder
-> Limit
-> Offset
-> ((Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID]))
-> SongQuery (Free f (Map UUID Song, [UUID]))
forall a.
Env
-> SongSortOrder
-> Limit
-> Offset
-> ((Map UUID Song, [UUID]) -> a)
-> SongQuery a
FetchSongs Env
env SongSortOrder
sortOrder Limit
fetchLimit Offset
offset (Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongsByUUID :: (SongQuery :<: f) => Env -> SongSortOrder -> [UUID] -> Free f (Map UUID Song, [UUID])
fetchSongsByUUID :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> SongSortOrder -> [UUID] -> Free f (Map UUID Song, [UUID])
fetchSongsByUUID Env
env SongSortOrder
sortOrder [UUID]
uuids = SongQuery (Free f (Map UUID Song, [UUID]))
-> Free f (Map UUID Song, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> SongSortOrder
-> [UUID]
-> ((Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID]))
-> SongQuery (Free f (Map UUID Song, [UUID]))
forall a.
Env
-> SongSortOrder
-> [UUID]
-> ((Map UUID Song, [UUID]) -> a)
-> SongQuery a
FetchSongsByUUID Env
env SongSortOrder
sortOrder [UUID]
uuids (Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)
enrichedSongResponse :: (SongQuery :<: f) => Env -> Map UUID Song -> EnrichSongParams -> Free f (Map UUID Song)
enrichedSongResponse :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> Map UUID Song -> EnrichSongParams -> Free f (Map UUID Song)
enrichedSongResponse Env
env Map UUID Song
songs EnrichSongParams
enrichParams = SongQuery (Free f (Map UUID Song)) -> Free f (Map UUID Song)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> Map UUID Song
-> EnrichSongParams
-> (Map UUID Song -> Free f (Map UUID Song))
-> SongQuery (Free f (Map UUID Song))
forall a.
Env
-> Map UUID Song
-> EnrichSongParams
-> (Map UUID Song -> a)
-> SongQuery a
EnrichedSongResponse Env
env Map UUID Song
songs EnrichSongParams
enrichParams Map UUID Song -> Free f (Map UUID Song)
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongComments :: (SongQuery :<: f) => Env -> [UUID] -> Free f (Map UUID SongComment)
Env
env [UUID]
uuids = SongQuery (Free f (Map UUID SongComment))
-> Free f (Map UUID SongComment)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID SongComment -> Free f (Map UUID SongComment))
-> SongQuery (Free f (Map UUID SongComment))
forall a.
Env -> [UUID] -> (Map UUID SongComment -> a) -> SongQuery a
FetchSongComments Env
env [UUID]
uuids Map UUID SongComment -> Free f (Map UUID SongComment)
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongOpinions :: (SongQuery :<: f) => Env -> [UUID] -> Free f (Map UUID SongOpinion)
fetchSongOpinions :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID SongOpinion)
fetchSongOpinions Env
env [UUID]
uuids = SongQuery (Free f (Map UUID SongOpinion))
-> Free f (Map UUID SongOpinion)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID SongOpinion -> Free f (Map UUID SongOpinion))
-> SongQuery (Free f (Map UUID SongOpinion))
forall a.
Env -> [UUID] -> (Map UUID SongOpinion -> a) -> SongQuery a
FetchSongOpinions Env
env [UUID]
uuids Map UUID SongOpinion -> Free f (Map UUID SongOpinion)
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongArtworks :: (SongQuery :<: f) => Env -> [UUID] -> Free f (Map UUID SongArtwork)
fetchSongArtworks :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID SongArtwork)
fetchSongArtworks Env
env [UUID]
uuids = SongQuery (Free f (Map UUID SongArtwork))
-> Free f (Map UUID SongArtwork)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID SongArtwork -> Free f (Map UUID SongArtwork))
-> SongQuery (Free f (Map UUID SongArtwork))
forall a.
Env -> [UUID] -> (Map UUID SongArtwork -> a) -> SongQuery a
FetchSongArtworks Env
env [UUID]
uuids Map UUID SongArtwork -> Free f (Map UUID SongArtwork)
forall (f :: * -> *) a. a -> Free f a
Pure)
searchSongs :: (SongQuery :<: f) => Env -> SearchInput -> SongSortOrder -> Limit -> Offset -> Free f (Map UUID Song, [UUID])
searchSongs :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env
-> SearchInput
-> SongSortOrder
-> Limit
-> Offset
-> Free f (Map UUID Song, [UUID])
searchSongs Env
env SearchInput
searchInput SongSortOrder
sortOrder Limit
fetchLimit Offset
offset = SongQuery (Free f (Map UUID Song, [UUID]))
-> Free f (Map UUID Song, [UUID])
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> SearchInput
-> SongSortOrder
-> Limit
-> Offset
-> ((Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID]))
-> SongQuery (Free f (Map UUID Song, [UUID]))
forall a.
Env
-> SearchInput
-> SongSortOrder
-> Limit
-> Offset
-> ((Map UUID Song, [UUID]) -> a)
-> SongQuery a
SearchSongs Env
env SearchInput
searchInput SongSortOrder
sortOrder Limit
fetchLimit Offset
offset (Map UUID Song, [UUID]) -> Free f (Map UUID Song, [UUID])
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongContents :: (SongQuery :<: f) => Env -> [UUID] -> Free f (Map UUID SongContent)
fetchSongContents :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> [UUID] -> Free f (Map UUID SongContent)
fetchSongContents Env
env [UUID]
uuids = SongQuery (Free f (Map UUID SongContent))
-> Free f (Map UUID SongContent)
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> (Map UUID SongContent -> Free f (Map UUID SongContent))
-> SongQuery (Free f (Map UUID SongContent))
forall a.
Env -> [UUID] -> (Map UUID SongContent -> a) -> SongQuery a
FetchSongContents Env
env [UUID]
uuids Map UUID SongContent -> Free f (Map UUID SongContent)
forall (f :: * -> *) a. a -> Free f a
Pure)
fetchSongArtists :: (SongQuery :<: f) => Env -> [UUID] -> Free f [(UUID, UUID, Text)]
fetchSongArtists :: forall (f :: * -> *).
(SongQuery :<: f) =>
Env -> [UUID] -> Free f [(UUID, UUID, Text)]
fetchSongArtists Env
env [UUID]
uuids = SongQuery (Free f [(UUID, UUID, Text)])
-> Free f [(UUID, UUID, Text)]
forall (g :: * -> *) (f :: * -> *) a.
(g :<: f) =>
g (Free f a) -> Free f a
injectFree (Env
-> [UUID]
-> ([(UUID, UUID, Text)] -> Free f [(UUID, UUID, Text)])
-> SongQuery (Free f [(UUID, UUID, Text)])
forall a.
Env -> [UUID] -> ([(UUID, UUID, Text)] -> a) -> SongQuery a
FetchSongArtists Env
env [UUID]
uuids [(UUID, UUID, Text)] -> Free f [(UUID, UUID, Text)]
forall (f :: * -> *) a. a -> Free f a
Pure)