{-# LANGUAGE CPP #-}
module Network.MPD.Commands.Query (Query, (=?), (<&>), anything) where
import Network.MPD.Commands.Arg
import Network.MPD.Commands.Types
import Data.Monoid
#if MIN_VERSION_base(4,9,0)
import Data.Semigroup
#endif
newtype Query = Query [Match] deriving Int -> Query -> ShowS
[Query] -> ShowS
Query -> String
(Int -> Query -> ShowS)
-> (Query -> String) -> ([Query] -> ShowS) -> Show Query
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Query] -> ShowS
$cshowList :: [Query] -> ShowS
show :: Query -> String
$cshow :: Query -> String
showsPrec :: Int -> Query -> ShowS
$cshowsPrec :: Int -> Query -> ShowS
Show
data Match = Match Metadata Value
instance Show Match where
show :: Match -> String
show (Match Metadata
meta Value
query) = Metadata -> String
forall a. Show a => a -> String
show Metadata
meta String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" \"" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Value -> String
forall a. ToString a => a -> String
toString Value
query String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
"\""
showList :: [Match] -> ShowS
showList [Match]
xs String
_ = [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (Match -> String) -> [Match] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Match -> String
forall a. Show a => a -> String
show [Match]
xs
instance Monoid Query where
mempty :: Query
mempty = [Match] -> Query
Query []
Query [Match]
a mappend :: Query -> Query -> Query
`mappend` Query [Match]
b = [Match] -> Query
Query ([Match]
a [Match] -> [Match] -> [Match]
forall a. [a] -> [a] -> [a]
++ [Match]
b)
#if MIN_VERSION_base(4,9,0)
instance Semigroup Query where
<> :: Query -> Query -> Query
(<>) = Query -> Query -> Query
forall a. Monoid a => a -> a -> a
mappend
#endif
instance MPDArg Query where
prep :: Query -> Args
prep = (Args -> Args -> Args) -> Args -> [Args] -> Args
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Args -> Args -> Args
forall a b. (MPDArg a, MPDArg b) => a -> b -> Args
(<++>) ([String] -> Args
Args []) ([Args] -> Args) -> (Query -> [Args]) -> Query -> Args
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Query -> [Args]
f
where f :: Query -> [Args]
f (Query [Match]
ms) = (Match -> Args) -> [Match] -> [Args]
forall a b. (a -> b) -> [a] -> [b]
map (\(Match Metadata
m Value
q) -> [String] -> Args
Args [Metadata -> String
forall a. Show a => a -> String
show Metadata
m] Args -> Value -> Args
forall a b. (MPDArg a, MPDArg b) => a -> b -> Args
<++> Value
q) [Match]
ms
anything :: Query
anything :: Query
anything = Query
forall a. Monoid a => a
mempty
(=?) :: Metadata -> Value -> Query
Metadata
m =? :: Metadata -> Value -> Query
=? Value
s = [Match] -> Query
Query [Metadata -> Value -> Match
Match Metadata
m Value
s]
infixr 6 <&>
(<&>) :: Query -> Query -> Query
<&> :: Query -> Query -> Query
(<&>) = Query -> Query -> Query
forall a. Monoid a => a -> a -> a
mappend