{-# LANGUAGE DefaultSignatures #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE TypeOperators #-} module Network.CAN.Class ( MonadCAN(..) ) where import Control.Monad.Trans (MonadTrans, lift) import Control.Monad.Trans.Except (ExceptT) import Control.Monad.Trans.Reader (ReaderT) import Control.Monad.Trans.State (StateT) import Network.CAN.Types (CANMessage(..)) class Monad m => MonadCAN m where send :: CANMessage -> m () default send :: ( MonadTrans t , MonadCAN m' , m ~ t m' ) => CANMessage -> m () send = m' () -> m () m' () -> t m' () forall (m :: * -> *) a. Monad m => m a -> t m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift (m' () -> m ()) -> (CANMessage -> m' ()) -> CANMessage -> m () forall b c a. (b -> c) -> (a -> b) -> a -> c . CANMessage -> m' () forall (m :: * -> *). MonadCAN m => CANMessage -> m () send recv :: m CANMessage default recv :: ( MonadTrans t , MonadCAN m' , m ~ t m' ) => m CANMessage recv = m' CANMessage -> t m' CANMessage forall (m :: * -> *) a. Monad m => m a -> t m a forall (t :: (* -> *) -> * -> *) (m :: * -> *) a. (MonadTrans t, Monad m) => m a -> t m a lift m' CANMessage forall (m :: * -> *). MonadCAN m => m CANMessage recv instance MonadCAN m => MonadCAN (ExceptT e m) instance MonadCAN m => MonadCAN (ReaderT r m) instance MonadCAN m => MonadCAN (StateT s m)