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