-- | Some useful functions.
module Language.Haskell.DTC.Mod
    ( modifyHsDecls
    , unBangType
    , modifyHsName
      ) where

import Language.Haskell.Syntax

-- | Lift a function over @[@'HsDecl'@]@ to a function over 'HsModule'.
modifyHsDecls :: ([HsDecl] -> [HsDecl]) -> (HsModule -> HsModule)
modifyHsDecls f (HsModule loc m es is decls) = HsModule loc m es is $ f decls

-- | Skip a bang in a type.
unBangType :: HsBangType -> HsType
unBangType (HsBangedTy x)   = x
unBangType (HsUnBangedTy x) = x

-- | Lift a function over 'String' to a function over 'HsName'.
modifyHsName :: (String -> String) -> (HsName -> HsName)
modifyHsName f (HsIdent x) = HsIdent $ f x
modifyHsName f (HsSymbol x) = HsSymbol $ f x