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

  run,
  get,
  modify,

  getClient,
  getType,
  getName,
  getBroadcastFilter,
  getErrorBounce,
  getNumPorts,
  getEventLost,

  setClient,
  setName,
  setBroadcastFilter,
  setErrorBounce,
  ) where

import qualified Sound.ALSA.Sequencer.Marshal.ClientInfo as ClientInfo
import qualified Sound.ALSA.Sequencer.Marshal.Client as Client
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 ClientInfo.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 -> ClientInfo.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 -> T a -> IO a
get :: forall mode a. T mode -> T a -> IO a
get T mode
h 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 -> IO T
ClientInfo.get T mode
h

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


liftGet :: (ClientInfo.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 :: (ClientInfo.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


getClient :: T Client.T
getType :: T Client.Type
getName :: T String
getBroadcastFilter :: T Bool
getErrorBounce :: T Bool
getNumPorts :: T Word
getEventLost :: T Word

getClient :: T T
getClient          = forall a. (T -> IO a) -> T a
liftGet T -> IO T
ClientInfo.getClient
getType :: T Type
getType            = forall a. (T -> IO a) -> T a
liftGet T -> IO Type
ClientInfo.getType
getName :: T String
getName            = forall a. (T -> IO a) -> T a
liftGet T -> IO String
ClientInfo.getName
getBroadcastFilter :: T Bool
getBroadcastFilter = forall a. (T -> IO a) -> T a
liftGet T -> IO Bool
ClientInfo.getBroadcastFilter
getErrorBounce :: T Bool
getErrorBounce     = forall a. (T -> IO a) -> T a
liftGet T -> IO Bool
ClientInfo.getErrorBounce
getNumPorts :: T Word
getNumPorts        = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
ClientInfo.getNumPorts
getEventLost :: T Word
getEventLost       = forall a. (T -> IO a) -> T a
liftGet T -> IO Word
ClientInfo.getEventLost


setClient :: Client.T -> T ()
setName :: String -> T ()
setBroadcastFilter :: Bool -> T ()
setErrorBounce :: Bool -> T ()

setClient :: T -> T ()
setClient          = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> T -> IO ()
ClientInfo.setClient
setName :: String -> T ()
setName            = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> String -> IO ()
ClientInfo.setName
setBroadcastFilter :: Bool -> T ()
setBroadcastFilter = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Bool -> IO ()
ClientInfo.setBroadcastFilter
setErrorBounce :: Bool -> T ()
setErrorBounce     = forall b a. (T -> b -> IO a) -> b -> T a
liftSet T -> Bool -> IO ()
ClientInfo.setErrorBounce