packages feed

free-foil-0.0.3: src/Control/Monad/Foil/TH/Util.hs

{-# LANGUAGE PatternSynonyms                 #-}
{-# LANGUAGE ViewPatterns                 #-}
{-# LANGUAGE LambdaCase            #-}
module Control.Monad.Foil.TH.Util where

import Language.Haskell.TH

peelConT :: Type -> Maybe (Name, [Type])
peelConT (ConT name) = Just (name, [])
peelConT (AppT f x) =
  case peelConT f of
    Just (g, xs) -> Just (g, xs ++ [x])
    Nothing -> Nothing
peelConT _ = Nothing

unpeelConT :: Name -> [Type] -> Type
unpeelConT = foldl AppT . ConT

pattern PeelConT :: Name -> [Type] -> Type
pattern PeelConT name types <- (peelConT -> Just (name, types)) where
  PeelConT name types = unpeelConT name types

tvarName :: TyVarBndr a -> Name
tvarName = \case
  PlainTV name _ -> name
  KindedTV name _ _ -> name

removeName :: VarBangType -> BangType
removeName (_name, bang_, type_) = (bang_, type_)