packages feed

fungll-combinators-0.4.1.1: src/GLL/Types/Input.hs

module GLL.Types.Input (
  module GLL.Types.Input) where

import GLL.Types.Grammar
import qualified    Data.Array as A

type Input t      = (A.Array Int t, [t])
type RawParser t  = [t] -> [[t]]  -- input to list of prefixes

mkInput :: (Parseable t) => [t] -> Input t
mkInput input = (A.listArray (0,m) (input++[eos]), input)
  where m = length input

inputLength :: Input t -> Int
inputLength = snd . A.bounds . fst

scanner_from_predicate :: (t -> Bool) -> RawParser t
scanner_from_predicate p (t:ts) | p t = [[t]]
scanner_from_predicate p _ = []

apply_scanner :: RawParser t -> Input t -> [[t]]
apply_scanner scanner (_,str) = scanner str

slice :: Input t -> Int -> Int -> [t]
slice (arr, str) l r 
  | lb <= l && r <= ub  = map (arr A.!) [l..r-1] 
  | otherwise           = []
  where (lb,ub) = A.bounds arr

removePrefix :: Int -> Input t -> Input t
removePrefix l (arr, str) = (arr, drop l str)