packages feed

hid-examples-0.3: du/App.hs

{-# LANGUAGE GeneralizedNewtypeDeriving  #-}

module App where

import Control.Monad.Writer
import Control.Monad.Reader
import Control.Monad.State
import System.Posix.Types

data AppConfig = AppConfig {
      basePath :: FilePath,
      maxDepth :: Int,
      ext :: Maybe FilePath
    }

data AppState s = AppState {
      curDepth :: Int,
      curPath :: FilePath,
      st_field :: s
    }

type AppLog s = [(FilePath, s)]

newtype MyApp s a = MyApp {
      runApp :: ReaderT AppConfig 
                  (WriterT (AppLog s)
                      (StateT (AppState s) 
                                   IO)) a
    } deriving (Functor, Applicative, Monad,
                MonadIO,
                MonadReader AppConfig,
                MonadWriter (AppLog s),
                MonadState (AppState s))

runMyApp :: MyApp s a -> AppConfig -> s -> IO (a, AppLog s)
runMyApp app config init =
  evalStateT
         (runWriterT
               (runReaderT (runApp app) config))
         (AppState 0 (basePath config) init)