module Data.Layer.Immersed where
import Prelude
import Control.Lens
import Control.Monad
import Data.Layer
class Immersed l a where immersed :: Lens' l a
instance Immersed l l where immersed = id
instance (Layered l, Immersed (Unlayered l) a) => Immersed l a where immersed = layered . immersed
class ImmersedM l m a where viewImmersedM :: l -> m a
instance (Monad m) => ImmersedM l m l where viewImmersedM = return
instance (Monad m, LayeredM m l, ImmersedM (Unlayered l) m a) => ImmersedM l m a where viewImmersedM = viewLayeredM >=> viewImmersedM