adp-multi-0.2.0: src/ADP/Multi/Tabulation.hs
-- | Combinators for two- and four-dimensional tabulation
module ADP.Multi.Tabulation where
import Data.Array
import ADP.Multi.Parser
-- | Two-dimensional tabulation for one-dim. parsers
table1' :: Array Int a -> Parser a b -> Parser a b
table1' z q =
let (_,n) = bounds z
arr = array ((0,0),(n,n))
[ ((i,j), q z [i,j])
| i <- [0..n], j <- [i..n] ]
in \ _ [i,j] -> arr ! (i,j)
-- | Two-dimensional tabulation for one-dim. parsers
table1 :: Array Int a -> RichParser a b -> RichParser a b
table1 z (info,q) = (info, table1' z q)
-- | Four-dimensional tabulation for two-dim. parsers
table2' :: Array Int a -> Parser a b -> Parser a b
table2' z q =
let (_,n) = bounds z
arr = array ((0,0,0,0),(n,n,n,n))
[ ((i,j,k,l), q z [i,j,k,l])
| i <- [0..n], j <- [i..n]
, k <- [0..n], l <- [k..n] ]
in \ _ [i,j,k,l] -> arr ! (i,j,k,l)
-- | Four-dimensional tabulation for two-dim. parsers
table2 :: Array Int a -> RichParser a b -> RichParser a b
table2 z (info,q) = (info, table2' z q)