{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE TypeOperators #-} module Control.ShiftMap where import Control.Natural (type (~>)) import Control.Monad.State (StateT, mapStateT) import Control.Monad.Trans.Identity (IdentityT, mapIdentityT) -- | Mapping between Natural Transformations class ShiftMap s t where shiftMap :: (s ~> s) -> (t ~> t) instance ShiftMap m m where shiftMap = id instance ShiftMap m (IdentityT m) where shiftMap = mapIdentityT instance ShiftMap m (StateT s m) where shiftMap = mapStateT