--------------------------------------------------------------------------------
-- |
-- Module    : Sound.ALSA.Sequencer.Port.Info
-- Copyright : (c) Henning Thielemann, 2010-2012
--             (c) Iavor S. Diatchki, 2007
-- License   : BSD3
--
-- Maintainer: Henning Thielemann
-- Stability : provisional
--
-- This module contains functions for working with ports.
-- Reference:
-- <http://www.alsa-project.org/alsa-doc/alsa-lib/group___seq_port.html>
--------------------------------------------------------------------------------

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Sound.ALSA.Sequencer.Port.InfoMonad (
  T,

  run,
  get,
  modify,

  getPort,
  getClient,
  getAddr,
  getName,
  getCapability,
  getMidiChannels,
  getMidiVoices,
  getSynthVoices,
  getPortSpecified,
  getTimestamping,
  getTimestampReal,
  getTimestampQueue,

  getReadUse,
  getWriteUse,

  setPort,
  setClient,
  setAddr,
  setName,
  setCapability,
  setMidiChannels,
  setSynthVoices,
  setMidiVoices,
  setPortSpecified,
  setTimestamping,
  setTimestampReal,
  setTimestampQueue,
  ) where

import qualified Sound.ALSA.Sequencer.Marshal.PortInfo as PortInfo
import qualified Sound.ALSA.Sequencer.Marshal.Port as Port
import qualified Sound.ALSA.Sequencer.Marshal.Client as Client
import qualified Sound.ALSA.Sequencer.Marshal.Queue as Queue
import qualified Sound.ALSA.Sequencer.Marshal.Address as Addr
import qualified Sound.ALSA.Sequencer.Marshal.Sequencer as Seq

import qualified Control.Monad.Trans.Reader as MR
import Control.Applicative (Applicative, )

import Data.Word (Word, )


newtype T a = Cons (MR.ReaderT PortInfo.T IO a)
   deriving (forall a b. a -> T b -> T a
forall a b. (a -> b) -> T a -> T b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> T b -> T a
$c<$ :: forall a b. a -> T b -> T a
fmap :: forall a b. (a -> b) -> T a -> T b
$cfmap :: forall a b. (a -> b) -> T a -> T b
Functor, Functor T
forall a. a -> T a
forall a b. T a -> T b -> T a
forall a b. T a -> T b -> T b
forall a b. T (a -> b) -> T a -> T b
forall a b c. (a -> b -> c) -> T a -> T b -> T c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. T a -> T b -> T a
$c<* :: forall a b. T a -> T b -> T a
*> :: forall a b. T a -> T b -> T b
$c*> :: forall a b. T a -> T b -> T b
liftA2 :: forall a b c. (a -> b -> c) -> T a -> T b -> T c
$cliftA2 :: forall a b c. (a -> b -> c) -> T a -> T b -> T c
<*> :: forall a b. T (a -> b) -> T a -> T b
$c<*> :: forall a b. T (a -> b) -> T a -> T b
pure :: forall a. a -> T a
$cpure :: forall a. a -> T a
Applicative, Applicative T
forall a. a -> T a
forall a b. T a -> T b -> T b
forall a b. T a -> (a -> T b) -> T b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> T a
$creturn :: forall a. a -> T a
>> :: forall a b. T a -> T b -> T b
$c>> :: forall a b. T a -> T b -> T b
>>= :: forall a b. T a -> (a -> T b) -> T b
$c>>= :: forall a b. T a -> (a -> T b) -> T b
Monad)


run :: T a -> PortInfo.T -> IO a
run :: forall a. T a -> T -> IO a
run (Cons ReaderT T IO a
m) = forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
MR.runReaderT ReaderT T IO a
m

get :: Seq.T mode -> Port.T -> T a -> IO a
get :: forall mode a. T mode -> T -> T a -> IO a
get T mode
h T
p T a
m = forall a. T a -> T -> IO a
run T a
m forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall mode. T mode -> T -> IO T
PortInfo.get T mode
h T
p

modify :: Seq.T mode -> Port.T -> T a -> IO a
modify :: forall mode a. T mode -> T -> T a -> IO a
modify T mode
h T
p T a
m = do
  T
i <- forall mode. T mode -> T -> IO T
PortInfo.get T mode
h T
p
  a
a <- forall a. T a -> T -> IO a
run T a
m T
i
  forall mode. T mode -> T -> T -> IO ()
PortInfo.set T mode
h T
p T
i
  forall (m :: * -> *) a. Monad m => a -> m a
return a
a


liftGet :: (PortInfo.T -> IO a) -> T a
liftGet :: forall a. (T -> IO a) -> T a
liftGet T -> IO a
f = forall a. ReaderT T IO a -> T a
Cons forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
MR.ReaderT T -> IO a
f

liftSet :: (PortInfo.T -> b -> IO a) -> b -> T a
liftSet :: forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> b -> IO a
f b
x = forall a. ReaderT T IO a -> T a
Cons forall a b. (a -> b) -> a -> b
$ forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
MR.ReaderT forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> b -> a -> c
flip T -> b -> IO a
f b
x


getPort :: T Port.T
getClient :: T Client.T
getAddr :: T Addr.T
getName :: T String
getCapability :: T Port.Cap
getMidiChannels :: T Word
getMidiVoices :: T Word
getSynthVoices :: T Word
getPortSpecified :: T Bool
getTimestamping :: T Bool
getTimestampReal :: T Bool
getTimestampQueue :: T Queue.T
getReadUse :: T Word
getWriteUse :: T Word

getPort :: T T
getPort           = forall a. (T -> IO a) -> T a
liftGet T -> IO T
PortInfo.getPort
getClient :: T T
getClient         = forall a. (T -> IO a) -> T a
liftGet T -> IO T
PortInfo.getClient
getAddr :: T T
getAddr           = forall a. (T -> IO a) -> T a
liftGet T -> IO T
PortInfo.getAddr
getName :: T String
getName           = forall a. (T -> IO a) -> T a
liftGet T -> IO String
PortInfo.getName
getCapability :: T Cap
getCapability     = forall a. (T -> IO a) -> T a
liftGet T -> IO Cap
PortInfo.getCapability
getMidiChannels :: T Word
getMidiChannels   = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
PortInfo.getMidiChannels
getMidiVoices :: T Word
getMidiVoices     = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
PortInfo.getMidiVoices
getSynthVoices :: T Word
getSynthVoices    = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
PortInfo.getSynthVoices
getPortSpecified :: T Bool
getPortSpecified  = forall a. (T -> IO a) -> T a
liftGet T -> IO Bool
PortInfo.getPortSpecified
getTimestamping :: T Bool
getTimestamping   = forall a. (T -> IO a) -> T a
liftGet T -> IO Bool
PortInfo.getTimestamping
getTimestampReal :: T Bool
getTimestampReal  = forall a. (T -> IO a) -> T a
liftGet T -> IO Bool
PortInfo.getTimestampReal
getTimestampQueue :: T T
getTimestampQueue = forall a. (T -> IO a) -> T a
liftGet T -> IO T
PortInfo.getTimestampQueue

getReadUse :: T Word
getReadUse        = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
PortInfo.getReadUse
getWriteUse :: T Word
getWriteUse       = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
PortInfo.getWriteUse


setPort :: Port.T -> T ()
setClient :: Client.T -> T ()
setAddr :: Addr.T -> T ()
setName :: String -> T ()
setCapability :: Port.Cap -> T ()
setMidiChannels :: Word -> T ()
setSynthVoices :: Word -> T ()
setMidiVoices :: Word -> T ()
setPortSpecified :: Bool -> T ()
setTimestamping :: Bool -> T ()
setTimestampReal :: Bool -> T ()
setTimestampQueue :: Queue.T -> T ()

setPort :: T -> T ()
setPort           = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> T -> IO ()
PortInfo.setPort
setClient :: T -> T ()
setClient         = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> T -> IO ()
PortInfo.setClient
setAddr :: T -> T ()
setAddr           = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> T -> IO ()
PortInfo.setAddr
setName :: String -> T ()
setName           = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> String -> IO ()
PortInfo.setName
setCapability :: Cap -> T ()
setCapability     = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Cap -> IO ()
PortInfo.setCapability
setMidiChannels :: Word -> T ()
setMidiChannels   = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Word -> IO ()
PortInfo.setMidiChannels
setSynthVoices :: Word -> T ()
setSynthVoices    = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Word -> IO ()
PortInfo.setSynthVoices
setMidiVoices :: Word -> T ()
setMidiVoices     = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Word -> IO ()
PortInfo.setMidiVoices
setPortSpecified :: Bool -> T ()
setPortSpecified  = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Bool -> IO ()
PortInfo.setPortSpecified
setTimestamping :: Bool -> T ()
setTimestamping   = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Bool -> IO ()
PortInfo.setTimestamping
setTimestampReal :: Bool -> T ()
setTimestampReal  = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Bool -> IO ()
PortInfo.setTimestampReal
setTimestampQueue :: T -> T ()
setTimestampQueue = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> T -> IO ()
PortInfo.setTimestampQueue