module Sound.MED.Basic.AmigaPrivate where import qualified Sound.MED.Basic.Storable as MedStore import qualified Sound.MED.Basic.ByteString as MedBytes import Sound.MED.Basic.Storable (MEM) import Data.ByteString (ByteString) import Sound.MED.Basic.Utility (PTR, LONG, ULONG, WORD, UWORD, BYTE, UBYTE) import qualified Control.Monad.Trans.Class as MT import qualified Control.Monad.Trans.Reader as MR type Peek m a = PTR -> m a class (MonadFail m) => Reader m where peekLONG :: Peek m LONG peekULONG :: Peek m ULONG peekWORD :: Peek m WORD peekUWORD :: Peek m UWORD peekBYTE :: Peek m BYTE peekUBYTE :: Peek m UBYTE {-# INLINE peekPTR #-} peekPTR :: (Reader m) => Peek m PTR peekPTR :: forall (m :: * -> *). Reader m => Peek m PTR peekPTR = forall (m :: * -> *). Reader m => Peek m PTR peekULONG newtype StorableReader a = StorableReader (MR.ReaderT MEM IO a) instance Functor StorableReader where fmap :: forall a b. (a -> b) -> StorableReader a -> StorableReader b fmap a -> b f (StorableReader ReaderT MEM IO a act) = forall a. ReaderT MEM IO a -> StorableReader a StorableReader forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b f ReaderT MEM IO a act instance Applicative StorableReader where pure :: forall a. a -> StorableReader a pure = forall a. ReaderT MEM IO a -> StorableReader a StorableReader forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a. Applicative f => a -> f a pure StorableReader ReaderT MEM IO (a -> b) f <*> :: forall a b. StorableReader (a -> b) -> StorableReader a -> StorableReader b <*> StorableReader ReaderT MEM IO a m = forall a. ReaderT MEM IO a -> StorableReader a StorableReader (ReaderT MEM IO (a -> b) f forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> ReaderT MEM IO a m) instance Monad StorableReader where return :: forall a. a -> StorableReader a return = forall (f :: * -> *) a. Applicative f => a -> f a pure StorableReader ReaderT MEM IO a x >>= :: forall a b. StorableReader a -> (a -> StorableReader b) -> StorableReader b >>= a -> StorableReader b f = forall a. ReaderT MEM IO a -> StorableReader a StorableReader forall a b. (a -> b) -> a -> b $ ReaderT MEM IO a x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= \a a -> case a -> StorableReader b f a a of StorableReader ReaderT MEM IO b y -> ReaderT MEM IO b y instance MonadFail StorableReader where fail :: forall a. String -> StorableReader a fail = forall a. ReaderT MEM IO a -> StorableReader a StorableReader forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a MT.lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (m :: * -> *) a. MonadFail m => String -> m a fail runStorable :: StorableReader a -> MEM -> IO a runStorable :: forall a. StorableReader a -> MEM -> IO a runStorable (StorableReader ReaderT MEM IO a rd) = forall r (m :: * -> *) a. ReaderT r m a -> r -> m a MR.runReaderT ReaderT MEM IO a rd {-# INLINE liftStorable #-} liftStorable :: MedStore.Peek a -> PTR -> StorableReader a liftStorable :: forall a. Peek a -> PTR -> StorableReader a liftStorable Peek a peek PTR ptr = forall a. ReaderT MEM IO a -> StorableReader a StorableReader (forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a MR.ReaderT forall a b. (a -> b) -> a -> b $ \MEM mem -> Peek a peek MEM mem PTR ptr) instance Reader StorableReader where peekLONG :: Peek StorableReader LONG peekLONG = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. (Storable a, HasBigEndian a) => Peek a MedStore.peekBig peekULONG :: Peek StorableReader PTR peekULONG = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. (Storable a, HasBigEndian a) => Peek a MedStore.peekBig peekWORD :: Peek StorableReader WORD peekWORD = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. (Storable a, HasBigEndian a) => Peek a MedStore.peekBig peekUWORD :: Peek StorableReader UWORD peekUWORD = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. (Storable a, HasBigEndian a) => Peek a MedStore.peekBig peekBYTE :: Peek StorableReader BYTE peekBYTE = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. Storable a => Peek a MedStore.peekOffset peekUBYTE :: Peek StorableReader UBYTE peekUBYTE = forall a. Peek a -> PTR -> StorableReader a liftStorable forall a. Storable a => Peek a MedStore.peekOffset newtype ByteStringReader a = ByteStringReader (MR.ReaderT ByteString (Either String) a) instance Functor ByteStringReader where fmap :: forall a b. (a -> b) -> ByteStringReader a -> ByteStringReader b fmap a -> b f (ByteStringReader ReaderT ByteString (Either String) a act) = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader forall a b. (a -> b) -> a -> b $ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap a -> b f ReaderT ByteString (Either String) a act instance Applicative ByteStringReader where pure :: forall a. a -> ByteStringReader a pure = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a. Applicative f => a -> f a pure ByteStringReader ReaderT ByteString (Either String) (a -> b) f <*> :: forall a b. ByteStringReader (a -> b) -> ByteStringReader a -> ByteStringReader b <*> ByteStringReader ReaderT ByteString (Either String) a m = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader (ReaderT ByteString (Either String) (a -> b) f forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*> ReaderT ByteString (Either String) a m) instance Monad ByteStringReader where return :: forall a. a -> ByteStringReader a return = forall (f :: * -> *) a. Applicative f => a -> f a pure ByteStringReader ReaderT ByteString (Either String) a x >>= :: forall a b. ByteStringReader a -> (a -> ByteStringReader b) -> ByteStringReader b >>= a -> ByteStringReader b f = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader forall a b. (a -> b) -> a -> b $ ReaderT ByteString (Either String) a x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= \a a -> case a -> ByteStringReader b f a a of ByteStringReader ReaderT ByteString (Either String) b y -> ReaderT ByteString (Either String) b y instance MonadFail ByteStringReader where fail :: forall a. String -> ByteStringReader a fail = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a MT.lift forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a b. a -> Either a b Left runByteString :: ByteStringReader a -> ByteString -> Either String a runByteString :: forall a. ByteStringReader a -> ByteString -> Either String a runByteString (ByteStringReader ReaderT ByteString (Either String) a rd) = forall r (m :: * -> *) a. ReaderT r m a -> r -> m a MR.runReaderT ReaderT ByteString (Either String) a rd {-# INLINE liftByteString #-} liftByteString :: MedBytes.Peek a -> PTR -> ByteStringReader a liftByteString :: forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek a peek PTR ptr = forall a. ReaderT ByteString (Either String) a -> ByteStringReader a ByteStringReader (forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a MR.ReaderT forall a b. (a -> b) -> a -> b $ \ByteString mem -> forall a b. b -> Either a b Right forall a b. (a -> b) -> a -> b $ Peek a peek ByteString mem PTR ptr) instance Reader ByteStringReader where peekLONG :: Peek ByteStringReader LONG peekLONG = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek LONG MedBytes.peekInt32 peekULONG :: Peek ByteStringReader PTR peekULONG = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek PTR MedBytes.peekWord32 peekWORD :: Peek ByteStringReader WORD peekWORD = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek WORD MedBytes.peekInt16 peekUWORD :: Peek ByteStringReader UWORD peekUWORD = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek UWORD MedBytes.peekWord16 peekBYTE :: Peek ByteStringReader BYTE peekBYTE = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek BYTE MedBytes.peekInt8 peekUBYTE :: Peek ByteStringReader UBYTE peekUBYTE = forall a. Peek a -> PTR -> ByteStringReader a liftByteString Peek UBYTE MedBytes.peekWord8