packages feed

agda-unused-0.1.0: src/Agda/Unused/Monad/Reader.hs

{- |
Module: Agda.Unused.Monad.Reader

A reader monad for determining unused code.
-}
module Agda.Unused.Monad.Reader

  ( -- * Definition
    
    Environment(..)

    -- * Ask

  , askSkip
  , askLocal
  , askRoot

    -- * Local

  , localSkip

  ) where

import Control.Monad.Reader
  (MonadReader, ask, local)

-- | An environment type for use in a reader monad.
data Environment
  = Environment
  { environmentSkip
    :: !Bool
    -- ^ Whether to skip all names.
  , environmentLocal
    :: !Bool
    -- ^ Whether to skip public names.
  , environmentRoot
    :: !FilePath
    -- ^ The project root path.
  } deriving Show

-- | Ask whether to skip checking names.
askSkip
  :: MonadReader Environment m
  => m Bool
askSkip
  = environmentSkip <$> ask

-- | Ask whether to skip checking public names.
askLocal
  :: MonadReader Environment m
  => m Bool
askLocal
  = environmentLocal <$> ask

-- | Ask for the project root path.
askRoot
  :: MonadReader Environment m
  => m FilePath
askRoot
  = environmentRoot <$> ask

-- | Skip checking names in a local computation.
localSkip
  :: MonadReader Environment m
  => m a
  -> m a
localSkip
  = local (\e -> e {environmentSkip = True})