    {-|
    Module      : Network.MPD.Commands.ClientToClient
    Copyright   : (c) Joachim Fasting 2013
    License     : MIT (see LICENSE)

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

    Client-to-client communication.
    -}

    module Network.MPD.Commands.ClientToClient
        ( -- * Types
          A.ChannelName
        , A.MessageText
          -- * Subscribing to channels
        , subscribe
        , unsubscribe
        , channels
          -- * Communicating with other clients
        , readMessages
        , sendMessage
        ) where

    ------------------------------------------------------------------------

    import qualified Network.MPD.Applicative.Internal as A
    import qualified Network.MPD.Applicative.ClientToClient as A
    import           Network.MPD.Core

    ------------------------------------------------------------------------

    subscribe :: MonadMPD m => A.ChannelName -> m ()
    subscribe :: forall (m :: * -> *). MonadMPD m => ChannelName -> m ()
    subscribe = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command () -> m ())
    -> (ChannelName -> Command ()) -> ChannelName -> m ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ChannelName -> Command ()
    A.subscribe

    unsubscribe :: MonadMPD m => A.ChannelName -> m ()
    unsubscribe :: forall (m :: * -> *). MonadMPD m => ChannelName -> m ()
    unsubscribe = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (Command () -> m ())
    -> (ChannelName -> Command ()) -> ChannelName -> m ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ChannelName -> Command ()
    A.subscribe

    channels :: MonadMPD m => m [A.ChannelName]
    channels :: forall (m :: * -> *). MonadMPD m => m [ChannelName]
    channels = Command [ChannelName] -> m [ChannelName]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command [ChannelName]
    A.channels

    readMessages :: MonadMPD m => m [(A.ChannelName, A.MessageText)]
    readMessages :: forall (m :: * -> *). MonadMPD m => m [(ChannelName, ChannelName)]
    readMessages = Command [(ChannelName, ChannelName)]
    -> m [(ChannelName, ChannelName)]
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand Command [(ChannelName, ChannelName)]
    A.readMessages

    sendMessage :: MonadMPD m => A.ChannelName -> A.MessageText -> m ()
    sendMessage :: forall (m :: * -> *).
    MonadMPD m =>
    ChannelName -> ChannelName -> m ()
    sendMessage ChannelName
    name ChannelName
    text = Command () -> m ()
    forall (m :: * -> *) a. MonadMPD m => Command a -> m a
    A.runCommand (ChannelName -> ChannelName -> Command ()
    A.sendMessage ChannelName
    name ChannelName
    text)