{-# 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)