{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE UndecidableInstances #-} module PDF.Box ( Box(..) , modifyAt ) where import Control.Monad.State (MonadState(..)) class Box m i a b | m a i -> b where r :: i -> a -> m b w :: i -> a -> b -> m a modifyAt :: (MonadState a m, Box m i a b) => i -> (b -> m b) -> m () modifyAt i f = do a <- get r i a >>= f >>= w i a >>= put instance (Box m i a b, Box m j b c) => Box m (i, j) a c