{-# LANGUAGE FlexibleContexts #-}

-- | Module    : Network.MPD.Core.Class
-- Copyright   : (c) Ben Sinclair 2005-2009, Joachim Fasting 2010
-- License     : MIT (see LICENSE)
-- Maintainer  : Joachim Fasting <joachifm@fastmail.fm>
-- Stability   : alpha
--
-- The MPD typeclass.

module Network.MPD.Core.Class where

import           Data.ByteString (ByteString)

import           Network.MPD.Core.Error (MPDError)

import           Control.Monad.Except (MonadError)

type Password = String

-- | A typeclass to allow for multiple implementations of a connection
--   to an MPD server.
class (Monad m, MonadError MPDError m) => MonadMPD m where
    -- | Open (or re-open) a connection to the MPD server.
    open  :: m ()
    -- | Close the connection.
    close :: m ()
    -- | Send a string to the server and return its response.
    send  :: String -> m [ByteString]
    -- | Produce a password to send to the server should it ask for
    --   one.
    getPassword :: m Password
    -- | Alters password to be sent to the server.
    setPassword :: Password -> m ()
    -- | Get MPD protocol version
    getVersion :: m (Int, Int, Int)