{-# LANGUAGE RankNTypes #-}

module Hhp.Syb (
    listifySpans,
) where

import GHC (GenLocated (L), TypecheckedSource, isGoodSrcSpan, spans)

import Data.Generics (GenericQ, Typeable, gmapQ, mkQ)

import Hhp.Gap

listifySpans :: Typeable a => TypecheckedSource -> (Int, Int) -> [LOC a]
listifySpans :: forall a. Typeable a => TypecheckedSource -> (Int, Int) -> [LOC a]
listifySpans TypecheckedSource
tcs (Int, Int)
lc = ([LOC a] -> [LOC a] -> [LOC a])
-> GenericQ [LOC a] -> GenericQ [LOC a]
forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything' [LOC a] -> [LOC a] -> [LOC a]
forall a. [a] -> [a] -> [a]
(++) ([] [LOC a] -> (LOC a -> [LOC a]) -> a -> [LOC a]
forall a b r. (Typeable a, Typeable b) => r -> (b -> r) -> a -> r
`mkQ` (\LOC a
x -> [LOC a
x | LOC a -> Bool
forall {a} {e}. GenLocated (SrcSpanAnn' a) e -> Bool
p LOC a
x])) TypecheckedSource
Bag (GenLocated SrcSpanAnnA (HsBindLR GhcTc GhcTc))
tcs
  where
    p :: GenLocated (SrcSpanAnn' a) e -> Bool
p (L SrcSpanAnn' a
spn e
_) = SrcSpan -> Bool
isGoodSrcSpan (SrcSpanAnn' a -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' a
spn) Bool -> Bool -> Bool
&& (SrcSpanAnn' a -> SrcSpan
forall a. SrcSpanAnn' a -> SrcSpan
locA SrcSpanAnn' a
spn) SrcSpan -> (Int, Int) -> Bool
`spans` (Int, Int)
lc

everything' :: (r -> r -> r) -> GenericQ r -> GenericQ r
everything' :: forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything' r -> r -> r
k GenericQ r
f a
x = (r -> r -> r) -> r -> [r] -> r
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl r -> r -> r
k (a -> r
GenericQ r
f a
x) ([r] -> r) -> [r] -> r
forall a b. (a -> b) -> a -> b
$ GenericQ r -> a -> [r]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
forall u. (forall d. Data d => d -> u) -> a -> [u]
gmapQ ((r -> r -> r) -> GenericQ r -> GenericQ r
forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything' r -> r -> r
k a -> r
GenericQ r
f) a
x