    {-# LANGUAGE OverloadedStrings #-}

    {- |
    Module      : Network.MPD.Commands.Stickers
    Copyright   : (c) Ben Sinclair 2005-2009, Joachim Fasting 2012
    License     : MIT (see LICENSE)

    Maintainer  : joachifm@fastmail.fm
    Stability   : stable
    Portability : unportable

    Stickers.
    -}

    module Network.MPD.Commands.Stickers
        ( stickerGet
        , stickerSet
        , stickerDelete
        , stickerList
        , stickerFind
        ) where

    import qualified Network.MPD.Applicative.Internal as A
    import qualified Network.MPD.Applicative.Stickers as A
    import           Network.MPD.Commands.Types
    import           Network.MPD.Core

    -- | Reads a sticker value for the specified object.
    stickerGet :: MonadMPD m => ObjectType
               -> String -- ^ Object URI
               -> String -- ^ Sticker name
               -> m [String]
    stickerGet :: forall (m :: * -> *).
    MonadMPD m =>
    ObjectType -> String -> String -> m [String]
    stickerGet ObjectType
    typ String
    uri = Command [String] -> m [String]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command [String] -> m [String])
    -> (String -> Command [String]) -> String -> m [String]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ObjectType -> String -> String -> Command [String]
    A.stickerGet ObjectType
    typ String
    uri

    -- | Adds a sticker value to the specified object.
    stickerSet :: MonadMPD m => ObjectType
               -> String -- ^ Object URI
               -> String -- ^ Sticker name
               -> String -- ^ Sticker value
               -> m ()
    stickerSet :: forall (m :: * -> *).
    MonadMPD m =>
    ObjectType -> String -> String -> String -> m ()
    stickerSet ObjectType
    typ String
    uri String
    name = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command () -> m ()) -> (String -> Command ()) -> String -> m ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ObjectType -> String -> String -> String -> Command ()
    A.stickerSet ObjectType
    typ String
    uri String
    name

    -- | Delete a sticker value from the specified object.
    stickerDelete :: MonadMPD m => ObjectType
                  -> String -- ^ Object URI
                  -> String -- ^ Sticker name
                  -> m ()
    stickerDelete :: forall (m :: * -> *).
    MonadMPD m =>
    ObjectType -> String -> String -> m ()
    stickerDelete ObjectType
    typ String
    uri = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command () -> m ()) -> (String -> Command ()) -> String -> m ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ObjectType -> String -> String -> Command ()
    A.stickerDelete ObjectType
    typ String
    uri

    -- | Lists the stickers for the specified object.
    stickerList :: MonadMPD m => ObjectType
                -> String -- ^ Object URI
                -> m [(String, String)] -- ^ Sticker name\/sticker value
    stickerList :: forall (m :: * -> *).
    MonadMPD m =>
    ObjectType -> String -> m [(String, String)]
    stickerList ObjectType
    typ = Command [(String, String)] -> m [(String, String)]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command [(String, String)] -> m [(String, String)])
    -> (String -> Command [(String, String)])
    -> String
    -> m [(String, String)]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ObjectType -> String -> Command [(String, String)]
    A.stickerList ObjectType
    typ

    -- | Searches the sticker database for stickers with the specified name, below
    -- the specified path.
    stickerFind :: MonadMPD m => ObjectType
                -> String -- ^ Path
                -> String -- ^ Sticker name
                -> m [(String, String)] -- ^ URI\/sticker value
    stickerFind :: forall (m :: * -> *).
    MonadMPD m =>
    ObjectType -> String -> String -> m [(String, String)]
    stickerFind ObjectType
    typ String
    uri = Command [(String, String)] -> m [(String, String)]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command [(String, String)] -> m [(String, String)])
    -> (String -> Command [(String, String)])
    -> String
    -> m [(String, String)]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ObjectType -> String -> String -> Command [(String, String)]
    A.stickerFind ObjectType
    typ String
    uri