packages feed

network-can-0.1.0.0: src/Network/CAN/Class.hs

{-# 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 = lift . send

  recv :: m CANMessage
  default recv
    :: ( MonadTrans t
       , MonadCAN m'
       , m ~ t m'
       )
    => m CANMessage
  recv = lift recv

instance MonadCAN m => MonadCAN (ExceptT e m)
instance MonadCAN m => MonadCAN (ReaderT r m)
instance MonadCAN m => MonadCAN (StateT s m)