module WebBits.JavaScript.Combinators ( scriptStatements , isParenExpr , syntaxAt , expressionsAt , statementsAt ) where import Data.Generics (Data,Typeable, everything, mkQ) import Text.ParserCombinators.Parsec (SourcePos) import qualified Data.Foldable as F import Data.Foldable (Foldable) import WebBits.JavaScript.Syntax import WebBits.JavaScript.Instances () import WebBits.Common () scriptStatements:: JavaScript a -> [Statement a] scriptStatements (Script _ ss) = ss isParenExpr (ParenExpr _ _) = True isParenExpr _ = False syntaxAt :: (Data a, Typeable a, Data (t SourcePos), Typeable (t SourcePos), Foldable t) => SourcePos -> a -> [t SourcePos] syntaxAt pos a = everything (++) (mkQ [] isMatch) a where isMatch stx = case F.find (const True) stx of Nothing -> [] Just pos' | pos == pos' -> [stx] | otherwise -> [] expressionsAt :: (Data a, Typeable a) => SourcePos -> a -> [Expression SourcePos] expressionsAt = syntaxAt statementsAt :: (Data a, Typeable a) => SourcePos -> a -> [Statement SourcePos] statementsAt = syntaxAt