hpp-0.6.5: A Haskell pre-processor
Safe HaskellSafe-Inferred
LanguageHaskell2010

Hpp.Types

Description

The core types involved used by the pre-processor.

Synopsis

Documentation

type LineNum = Int Source #

Line numbers are represented as Ints

type Env = HashMap ByteString Macro Source #

A macro binding environment.

Changing the underlying string type

Errors

class HasError m where Source #

Hpp can raise various parsing errors.

Methods

throwError :: Error -> m a Source #

Instances

Instances details
(Monad m, HasError m) => HasError (StateT s m) Source # 
Instance details

Defined in Hpp.Types

Methods

throwError :: Error -> StateT s m a Source #

Monad m => HasError (ExceptT Error m) Source # 
Instance details

Defined in Hpp.Types

(Monad m, HasError m) => HasError (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

throwError :: Error -> HppT t m a Source #

Free Monad Transformers

data FreeF f a r Source #

Base functor for a free monad transformer

Constructors

PureF a 
FreeF (f r) 

Instances

Instances details
Functor f => Functor (FreeF f a) Source # 
Instance details

Defined in Hpp.Types

Methods

fmap :: (a0 -> b) -> FreeF f a a0 -> FreeF f a b #

(<$) :: a0 -> FreeF f a b -> FreeF f a a0 #

Pre-processor Actions

data HppState Source #

Dynamic state of the preprocessor engine.

Constructors

HppState 

Fields

Instances

Instances details
Show HppState Source # 
Instance details

Defined in Hpp.Types

Monad m => HasEnv (StateT HppState m) Source # 
Instance details

Defined in Hpp.Types

Monad m => HasHppState (StateT HppState m) Source # 
Instance details

Defined in Hpp.Types

data HppF t r Source #

A free monad construction to strictly delimit what capabilities we need to perform pre-processing.

Constructors

ReadFile Int FilePath (t -> r) 
ReadNext Int FilePath (t -> r) 
WriteOutput t r 

Instances

Instances details
Functor (HppF t) Source # 
Instance details

Defined in Hpp.Types

Methods

fmap :: (a -> b) -> HppF t a -> HppF t b #

(<$) :: a -> HppF t b -> HppF t a #

type Hpp t = FreeF (HppF t) Source #

Hpp is a monad with HppF as its base functor.

Hpp Monad Transformer

newtype HppT t m a Source #

A free monad transformer specialized to HppF as the base functor.

Constructors

HppT 

Fields

Instances

Instances details
MonadTrans (HppT t) Source # 
Instance details

Defined in Hpp.Types

Methods

lift :: Monad m => m a -> HppT t m a #

Monad m => Monad (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

(>>=) :: HppT t m a -> (a -> HppT t m b) -> HppT t m b #

(>>) :: HppT t m a -> HppT t m b -> HppT t m b #

return :: a -> HppT t m a #

Functor m => Functor (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

fmap :: (a -> b) -> HppT t m a -> HppT t m b #

(<$) :: a -> HppT t m b -> HppT t m a #

Monad m => Applicative (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

pure :: a -> HppT t m a #

(<*>) :: HppT t m (a -> b) -> HppT t m a -> HppT t m b #

liftA2 :: (a -> b -> c) -> HppT t m a -> HppT t m b -> HppT t m c #

(*>) :: HppT t m a -> HppT t m b -> HppT t m b #

(<*) :: HppT t m a -> HppT t m b -> HppT t m a #

MonadIO m => MonadIO (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

liftIO :: IO a -> HppT t m a #

(Monad m, HasHppState m) => HasEnv (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

getEnv :: HppT t m Env Source #

setEnv :: Env -> HppT t m () Source #

(Monad m, HasHppState m) => HasHppState (HppT t m) Source # 
Instance details

Defined in Hpp.Types

(Monad m, HasError m) => HasError (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

throwError :: Error -> HppT t m a Source #

hppReadFile :: Monad m => Int -> FilePath -> HppT src m src Source #

hppReadFile lineNumber fileName introduces an #include fileName at the given line number.

hppReadNext :: Monad m => Int -> FilePath -> HppT src m src Source #

hppReadNext lineNumber fileName introduces an #include_next fileName at the given line number.

hppWriteOutput :: Monad m => t -> HppT t m () Source #

class HasHppState m where Source #

An interpreter capability to modify dynamic state.

Instances

Instances details
(Monad m, HasHppState m) => HasHppState (StateT s m) Source # 
Instance details

Defined in Hpp.Types

Monad m => HasHppState (StateT HppState m) Source # 
Instance details

Defined in Hpp.Types

(Monad m, HasHppState m) => HasHppState (ExceptT e m) Source # 
Instance details

Defined in Hpp.Types

(Monad m, HasHppState m) => HasHppState (HppT t m) Source # 
Instance details

Defined in Hpp.Types

class HasEnv m where Source #

An interpreter capability of threading a binding environment.

Methods

getEnv :: m Env Source #

setEnv :: Env -> m () Source #

Instances

Instances details
Monad m => HasEnv (StateT HppState m) Source # 
Instance details

Defined in Hpp.Types

Monad m => HasEnv (StateT Env m) Source # 
Instance details

Defined in Hpp.Types

(HasEnv m, Monad m) => HasEnv (ExceptT e m) Source # 
Instance details

Defined in Hpp.Types

Methods

getEnv :: ExceptT e m Env Source #

setEnv :: Env -> ExceptT e m () Source #

(Monad m, HasHppState m) => HasEnv (HppT t m) Source # 
Instance details

Defined in Hpp.Types

Methods

getEnv :: HppT t m Env Source #

setEnv :: Env -> HppT t m () Source #

Expansion

data Scan Source #

Macro expansion involves treating tokens differently if they appear in the original source or as the result of a previous macro expansion. This distinction is used to prevent divergence by masking out definitions that could be used recursively.

Things are made somewhat more complicated than one might expect due to the fact that the scope of this masking is not structurally recursive. A object-like macro can expand into a fragment of a macro function application, one of whose arguments is a token matching the original object-like macro. That argument should not be expanded.

Instances

Instances details
Eq Scan Source # 
Instance details

Defined in Hpp.Types

Methods

(==) :: Scan -> Scan -> Bool #

(/=) :: Scan -> Scan -> Bool #

Show Scan Source # 
Instance details

Defined in Hpp.Types

Methods

showsPrec :: Int -> Scan -> ShowS #

show :: Scan -> String #

showList :: [Scan] -> ShowS #

Macros

data Macro Source #

There are object-like macros and function-like macros.

Constructors

Object [Token String]

An object-like macro is replaced with its definition

Function Int ([([Scan], String)] -> [Scan])

A function-like macro of some arity taks macro-expanded and raw versions of its arguments, then substitutes them into a body producing a new set of tokens.

Instances

Instances details
Show Macro Source # 
Instance details

Defined in Hpp.Types

Methods

showsPrec :: Int -> Macro -> ShowS #

show :: Macro -> String #

showList :: [Macro] -> ShowS #

Monad m => HasEnv (StateT Env m) Source # 
Instance details

Defined in Hpp.Types

lookupMacro :: (HasEnv m, Monad m) => String -> m (Maybe Macro) Source #

Looks up a Macro in the current environment. If the Macro is found, the environment is juggled so that subsequent lookups of the same Macro may evaluate more quickly.

Nano-lens

type Lens s a = forall f. Functor f => (a -> f a) -> s -> f s Source #

setL :: Lens s a -> a -> s -> s Source #

getL :: Lens s a -> s -> a Source #

over :: Lens s a -> (a -> a) -> s -> s Source #

State Lenses

use :: (HasHppState m, Functor m) => Lens HppState a -> m a Source #

(.=) :: (HasHppState m, Monad m) => Lens HppState a -> a -> m () infix 4 Source #

(%=) :: (HasHppState m, Monad m) => Lens HppState a -> (a -> a) -> m () infix 4 Source #