llvm-extra-0.7.3: Utility functions for the llvm interface

Safe HaskellNone

LLVM.Extra.Iterator

Contents

Synopsis

Documentation

data T r a Source

Simulates a non-strict list.

Constructors

forall s . Phi s => Cons s (forall z. Phi z => s -> T r z (a, s)) 

Instances

Functor (T r) 
Applicative (T r)

ZipList semantics

mapM_ :: (a -> CodeGenFunction r ()) -> T r a -> CodeGenFunction r ()Source

mapState_ :: Phi t => (a -> t -> CodeGenFunction r t) -> T r a -> t -> CodeGenFunction r tSource

mapStateM_ :: Phi t => (a -> StateT t (CodeGenFunction r) ()) -> T r a -> StateT t (CodeGenFunction r) ()Source

mapWhileState_ :: Phi t => (a -> t -> CodeGenFunction r (Value Bool, t)) -> T r a -> t -> CodeGenFunction r tSource

empty :: T r aSource

singleton :: a -> T r aSource

mapM :: (a -> CodeGenFunction r b) -> T r a -> T r bSource

mapMaybe :: (Phi b, Undefined b) => (a -> CodeGenFunction r (T b)) -> T r a -> T r bSource

catMaybes :: (Phi a, Undefined a) => T r (T a) -> T r aSource

takeWhile :: (a -> CodeGenFunction r (Value Bool)) -> T r a -> T r aSource

iterate :: Phi a => (a -> CodeGenFunction r a) -> a -> T r aSource

Attention: This always performs one function call more than necessary. I.e. if f reads from or writes to memory make sure that accessing one more pointer is legal.

maybeFromCont :: a -> T r (T a) a -> CodeGenFunction r (T a)Source

This is MaybeCont.toMaybe' where (Undefined a) constraint is replaced by a custom value. This way, we do not need Undefined constraint in T. On the other hand, an LLVM-undefined value would enable more LLVM optimizations.

cartesianAux :: (Phi a, Phi b, Undefined a, Undefined b) => T r a -> T r b -> T r (T (a, b))Source

helper functions

cartesian :: (Phi a, Phi b, Undefined a, Undefined b) => T r a -> T r b -> T r (a, b)Source

countDown :: (Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> T r (Value i)Source

take :: (Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> T r a -> T r aSource

arrayPtrs :: IsType a => Value (Ptr a) -> T r (Value (Ptr a))Source

examples

fixedLengthLoop :: (Phi s, Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> s -> (s -> CodeGenFunction r s) -> CodeGenFunction r sSource

arrayLoop :: (Phi a, IsType b, Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> Value (Ptr b) -> a -> (Value (Ptr b) -> a -> CodeGenFunction r a) -> CodeGenFunction r aSource

arrayLoopWithExit :: (Phi s, IsType a, Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> Value (Ptr a) -> s -> (Value (Ptr a) -> s -> CodeGenFunction r (Value Bool, s)) -> CodeGenFunction r (Value i, s)Source

arrayLoop2 :: (Phi s, IsType a, IsType b, Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) => Value i -> Value (Ptr a) -> Value (Ptr b) -> s -> (Value (Ptr a) -> Value (Ptr b) -> s -> CodeGenFunction r s) -> CodeGenFunction r sSource