Skip to content

Instantly share code, notes, and snippets.

@purefn
Created February 17, 2015 00:44
Show Gist options
  • Save purefn/516363845b44a7f607c6 to your computer and use it in GitHub Desktop.
Save purefn/516363845b44a7f607c6 to your computer and use it in GitHub Desktop.
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
module Stack where
import Control.Applicative
import Control.Lens
import Control.Monad.State
data OuterData = OuterData
{ _outerDataName :: String
}
data InnerData = InnerData
{ _innerDataName :: String
}
makeClassy ''OuterData
makeClassy ''InnerData
newtype InnerT m a = InnerT { unInnerT :: StateT InnerData m a }
deriving (Functor, Applicative, Monad)
newtype OuterT m a = OuterT { unOuterT :: StateT OuterData (InnerT m) a }
deriving (Functor, Applicative, Monad)
instance HasOuterData (InnerData, OuterData) where
outerData = _2
instance HasInnerData (InnerData, OuterData) where
innerData = _1
instance Monad m => MonadState (InnerData, OuterData) (OuterT m) where
getOuterName :: (MonadState s m, HasOuterData s) => m String
getOuterName = use outerDataName
getInnerName :: (MonadState s m, HasInnerData s) => m String
getInnerName = use innerDataName
a :: OuterT Identity String
a = getInnerName
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment