module Language.Haskell.Explorer where

import Language.Haskell.Syntax

data EO = E HsExp | O HsQOp

exploreExprs f exprs = exploreEO f $ map (E) exprs

exploreEO f es = any f es || any (exploreEO' f) es

exploreEO' :: (EO -> Bool) -> EO -> Bool
exploreEO' f (E (HsInfixApp a b c)) = exploreEO f [E a, O b, E c]
exploreEO' f (E (HsApp a b))  = exploreEO f [E a, E b]
exploreEO' f (E (HsNegApp a))  = exploreEO f [E a]
exploreEO' f (E (HsLambda _ _ a)) = exploreEO f [E a]
exploreEO' f (E (HsList as)) = exploreExprs f as
exploreEO' f (E (HsListComp a _)) = exploreExprs f [a] --TODO
exploreEO' f (E (HsTuple as))  = exploreExprs f as
exploreEO' f (E (HsParen a)) = exploreExprs f [a]
exploreEO' f (E (HsIf a b c)) = exploreExprs f [a, b, c]
exploreEO' _ _ = False

topExprs (HsUnGuardedRhs e) = [e]
topExprs (HsGuardedRhss rhss) = rhss >>= \(HsGuardedRhs _ es1 es2) -> [es1, es2]