ADPfusion-0.2.0.4: Efficient, high-level dynamic programming.

Safe HaskellNone

ADP.Fusion.Classes

Contents

Synopsis

Data and type constructors

data CheckNoCheck Source

The Inner/Outer handler. We encode three states. We are in Outer or right-most position, or Inner position. The Inner position encodes if loop conditional CheckNoCheck need to be performed.

In f <<< Z % table % table, the two tables already perform a conditional branch, so that Z/table does not have to check boundary conditions.

In f <<< Z % table % char, no check is performed in tablechar, so Ztable needs to perform a boundary check.

Constructors

Check 
NoCheck 

data ENE Source

Constructors

EmptyT 
NonEmptyT 
ZeroT 

Instances

Classes

class Elms x i whereSource

Associated Types

data Elm x i :: *Source

type Arg x :: *Source

Methods

getArg :: Elm x i -> Arg xSource

getIdx :: Elm x i -> iSource

Instances

Elms Z ix 
Elms ls Subword => Elms (:!: ls Empty) Subword 
Elms ls Subword => Elms (:!: ls (SRegion x)) Subword 
Elms ls Subword => Elms (:!: ls (Region x)) Subword 
Elms ls Subword => Elms (:!: ls (SwBtTbl m x b)) Subword 
Elms ls Subword => Elms (:!: ls (MTbl Subword (MutArr m (arr (:. Z Subword) x)))) Subword 
Elms ls Subword => Elms (:!: ls None) Subword 
Elms ls ix => Elms (:!: ls (Term a b)) ix 
Elms ls Subword => Elms (:!: ls (PeekR x)) Subword 
Elms ls Subword => Elms (:!: ls (PeekL x)) Subword 
Elms ls Subword => Elms (:!: ls (GPeek r x)) Subword 
Elms ls Subword => Elms (:!: ls (GChr r x)) Subword 
Elms ls (:. is i) => Elms (:!: ls (DefBtTbl m (:. is i) x b)) (:. is i) 
Elms ls (:. is i) => Elms (:!: ls (MTbl (:. is i) (MutArr m (arr (:. is i) x)))) (:. is i) 

class Index i whereSource

Associated Types

type InOut i :: *Source

type ENZ i :: *Source

type PartialIndex i :: *Source

type ParserRange i :: *Source

Instances

class EmptyENZ enz whereSource

Methods

toEmptyENZ :: enz -> enzSource

toNonEmptyENZ :: enz -> enzSource

Instances

class Monad m => MkStream m x i whereSource

Methods

mkStream :: x -> InOut i -> i -> Stream m (Elm x i)Source

Instances

Monad m => MkStream m Z Z 
Monad m => MkStream m Z Outside

The bottom of every stack of RHS arguments in a grammar.

Monad m => MkStream m Z Subword

The bottom of every stack of RHS arguments in a grammar.

(Monad m, MkStream m Z is) => MkStream m Z (:. is PointL) 
(Monad m, MkStream m Z is) => MkStream m Z (:. is Subword) 
(Monad m, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls Empty) Subword 
(Monad m, Unbox x, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (SRegion x)) Subword

TODO Check that all inner / outer sized calculations are correct

NOTE mkStream/Inner gives a size hint of Nothing, as in purely inner cases, min/max boundaries are determined solely from the running rightmost index from the next inner component.

NOTE the filter in mkStream/Outer is still necessary to check for lowerbound>0 conditions. We could send the lower bound down with another size hint, but this only makes sense if you have use cases, where the lower bound is a lot higher than 0. Otherwise the current code is simpler.

TODO use drop instead of filter: still condition, but large lower bounds are captured

TODO remove mkStream/Outer : filter and test if one condition less gives much better runtimes.

(Monad m, Unbox x, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (Region x)) Subword 
(Monad m, Elms ls Subword, Unbox x, MkStream m ls Subword) => MkStream m (:!: ls (SwBtTbl m x b)) Subword 
(Monad m, PrimMonad m, Elms ls Subword, MkStream m ls Subword, MPrimArrayOps arr (:. Z Subword) x) => MkStream m (:!: ls (MTbl Subword (MutArr m (arr (:. Z Subword) x)))) Subword 
(Monad m, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls None) Subword 
(Monad m, Elms ls ix, MkStream m ls ix, TermElm m (Term a b) ix, TermValidIndex (Term a b) ix) => MkStream m (:!: ls (Term a b)) ix 
(Monad m, Unbox x, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (PeekR x)) Subword 
(Monad m, Unbox x, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (PeekL x)) Subword 
(Monad m, Unbox x, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (GPeek r x)) Subword 
(Monad m, Elms ls Subword, MkStream m ls Subword) => MkStream m (:!: ls (GChr r x)) Subword 
(Monad m, Elms ls (:. is i), ExtShape (:. is i), Shape (:. is i), Unbox x, NonTermValidIndex (:. is i), TableIndices (:. is i), MkStream m ls (:. is i)) => MkStream m (:!: ls (DefBtTbl m (:. is i) x b)) (:. is i) 
(Monad m, PrimMonad m, MPrimArrayOps arr (:. is i) x, Elms ls (:. is i), NonTermValidIndex (:. is i), TableIndices (:. is i), MkStream m ls (:. is i)) => MkStream m (:!: ls (MTbl (:. is i) (MutArr m (arr (:. is i) x)))) (:. is i) 

class Build x whereSource

Build the stack using (%)

Associated Types

type Stack x :: *Source

Methods

build :: x -> Stack xSource

Instances

Build Empty 
Build None 
Build (SRegion x) 
Build (Region x) 
Build (PeekR x) 
Build (PeekL x) 
Build x => Build (:!: x y) 
Build (MTbl i x) 
Build (Term a b) 
Build (GPeek r x) 
Build (GChr r x) 
Build (BtTbl i xs f) 

class Index i => ValidIndex x i whereSource

ValidIndex, via validIndex statically checks if an index i is valid for a stack of terminals and non-terminals x. validIndex is used to short-circuit streams via outerCheck.

Methods

validIndex :: x -> ParserRange i -> i -> BoolSource

getParserRange :: x -> i -> ParserRange iSource

Instances

ValidIndex Z PointL 
ValidIndex Z Outside 
ValidIndex Z Subword 
ValidIndex Z Z 
(ValidIndex Z is, ValidIndex Z i) => ValidIndex Z (:. is i) 
ValidIndex ls Subword => ValidIndex (:!: ls Empty) Subword 
(ValidIndex ls Subword, Unbox xs) => ValidIndex (:!: ls (SRegion xs)) Subword 
(ValidIndex ls Subword, Unbox xs) => ValidIndex (:!: ls (Region xs)) Subword 
(ValidIndex ls Subword, Unbox x) => ValidIndex (:!: ls (SwBtTbl m x b)) Subword 
(ValidIndex ls Subword, Monad m, MPrimArrayOps arr (:. Z Subword) x) => ValidIndex (:!: ls (MTbl Subword (MutArr m (arr (:. Z Subword) x)))) Subword 
ValidIndex ls Subword => ValidIndex (:!: ls None) Subword 
(ValidIndex ls ix, TermValidIndex (Term a b) ix, Show ix, Show (ParserRange ix)) => ValidIndex (:!: ls (Term a b)) ix 
(ValidIndex ls Subword, Unbox x) => ValidIndex (:!: ls (PeekR x)) Subword 
(ValidIndex ls Subword, Unbox x) => ValidIndex (:!: ls (PeekL x)) Subword 
(ValidIndex ls Subword, Unbox x) => ValidIndex (:!: ls (GPeek r x)) Subword 
ValidIndex ls Subword => ValidIndex (:!: ls (GChr r x)) Subword 
(ValidIndex ls (:. is i), Shape (:. is i), ExtShape (:. is i), Unbox x, NonTermValidIndex (:. is i)) => ValidIndex (:!: ls (DefBtTbl m (:. is i) x b)) (:. is i) 
(ValidIndex ls (:. is i), MPrimArrayOps arr (:. is i) x, NonTermValidIndex (:. is i)) => ValidIndex (:!: ls (MTbl (:. is i) (MutArr m (arr (:. is i) x)))) (:. is i) 

Helper functions

checkValidIndex :: ValidIndex x i => x -> i -> BoolSource

Correct wrapping of validIndex and getParserRange.

outerCheck :: Monad m => Bool -> Stream m a -> Stream m aSource

outerCheck acts as a static filter. If b is true, we keep all stream elements. If b is false, we discard all stream elements.

Instances

Unsorted

PointL

Subword

Outside

Z

Multi-dim instances

'(is:.i)'

multi-dim with Subword

multi-dim with PointL

Special instances