    {-# LANGUAGE OverloadedStrings #-}

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

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

    Querying MPD's status.
    -}

    module Network.MPD.Commands.Status
        ( clearError
        , currentSong
        , idle
        , noidle
        , stats
        , status
        ) where

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

    -- | Clear the current error message in status.
    clearError :: MonadMPD m => m ()
    clearError :: forall (m :: * -> *). MonadMPD m => m ()
    clearError = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command ()
    A.clearError

    -- | Get the currently playing song.
    currentSong :: MonadMPD m => m (Maybe Song)
    currentSong :: forall (m :: * -> *). MonadMPD m => m (Maybe Song)
    currentSong = Command (Maybe Song) -> m (Maybe Song)
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command (Maybe Song)
    A.currentSong

    -- | Wait until there is a noteworthy change in one or more of MPD's
    -- susbystems.
    --
    -- The first argument is a list of subsystems that should be considered.  An
    -- empty list specifies that all subsystems should be considered.
    --
    -- A list of subsystems that have noteworthy changes is returned.
    --
    -- Note that running this command will block until either 'idle' returns or is
    -- cancelled by 'noidle'.
    idle :: MonadMPD m => [Subsystem] -> m [Subsystem]
    idle :: forall (m :: * -> *). MonadMPD m => [Subsystem] -> m [Subsystem]
    idle = Command [Subsystem] -> m [Subsystem]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command [Subsystem] -> m [Subsystem])
    -> ([Subsystem] -> Command [Subsystem])
    -> [Subsystem]
    -> m [Subsystem]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . [Subsystem] -> Command [Subsystem]
    A.idle

    -- | Cancel 'idle'.
    noidle :: MonadMPD m => m ()
    noidle :: forall (m :: * -> *). MonadMPD m => m ()
    noidle = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command ()
    A.noidle

    -- | Get server statistics.
    stats :: MonadMPD m => m Stats
    stats :: forall (m :: * -> *). MonadMPD m => m Stats
    stats = Command Stats -> m Stats
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command Stats
    A.stats

    -- | Get the server's status.
    status :: MonadMPD m => m Status
    status :: forall (m :: * -> *). MonadMPD m => m Status
    status = Command Status -> m Status
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command Status
    A.status