module Reactive.Banana.JACK.Common where

import qualified Sound.JACK.MIDI as JackMidi
import qualified Sound.JACK.Exception as JackExc
import qualified Sound.JACK as Jack

import qualified Control.Monad.Exception.Synchronous as Sync

import Control.Monad.Trans.Reader (ReaderT, runReaderT, )


data Handle =
   Handle {
      client :: Jack.Client,
      portIn :: JackMidi.Port Jack.Input,
      portOut :: JackMidi.Port Jack.Output
   }

with :: ReaderT Handle (Sync.ExceptionalT JackExc.All IO) () -> IO ()
with f =
   Jack.handleExceptions $
      Jack.withClientDefault "Haskell-MIDI-Filter" $ \c ->
      Jack.withPort c "input" $ \input ->
      Jack.withPort c "output" $ \output ->
      runReaderT f $ Handle c input output