content: -- | Utility functions to work with 'Scoped' data type from
  -- @haskell-names@ library.
  
  module Importify.Syntax.Scoped
         ( InScoped
         , anyAnnotation
         , pullScopedInfo
         , scopedNameInfo
         , unscope
         ) where
  
  import           Universum
  
  import           Language.Haskell.Exts  (Annotated (ann), SrcSpanInfo (..))
  import           Language.Haskell.Names (NameInfo, Scoped (..))
  
  -- | Short wrapper for types annotated by @Scoped SrcSpanInfo@.
  -- For example, use @InScoped ImportDecl@ instead of @ImportDecl (Scoped SrcSpanInfo)@.
  type InScoped t = t (Scoped SrcSpanInfo)
  
  -- | Retrive 'NameInfo' from 'Scoped'.
  scopedNameInfo :: Scoped l -> NameInfo l
  scopedNameInfo (Scoped info _) = info
  
  -- | Retrive 'NameInfo' from something annotated by 'Scoped'.
  pullScopedInfo :: Annotated ast => ast (Scoped l) -> NameInfo l
  pullScopedInfo = scopedNameInfo . ann
  
  -- | Drop 'Scoped' annotation from 'Functor' type.
  unscope :: Functor f => f (Scoped l) -> f l
  unscope = fmap $ \case Scoped _ l -> l
  
  anyAnnotation :: (NameInfo l -> Bool) -> [Scoped l] -> Bool
  anyAnnotation used = any used . map scopedNameInfo
  