module Mangle.TH ( mangle ) where
import qualified Mangle
import Language.Haskell.TH
mangle :: String -> Q [Dec] -> Q [Dec]
mangle :: String -> Q [Dec] -> Q [Dec]
mangle String
sig Q [Dec]
decls = do
String
mangled <- case String -> Either ParseError String
Mangle.mangle String
sig of
Left ParseError
err -> String -> Q String
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (ParseError -> String
forall a. Show a => a -> String
show ParseError
err)
Right String
mangled -> String -> Q String
forall a. a -> Q a
forall (m :: * -> *) a. Monad m => a -> m a
return String
mangled
let
mangleForeign :: Dec -> m Dec
mangleForeign (ForeignD (ImportF Callconv
conv Safety
safety String
_ Name
name Type
ty)) = do
Dec -> m Dec
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Dec -> m Dec) -> Dec -> m Dec
forall a b. (a -> b) -> a -> b
$ Foreign -> Dec
ForeignD (Callconv -> Safety -> String -> Name -> Type -> Foreign
ImportF Callconv
conv Safety
safety String
mangled Name
name Type
ty)
mangleForeign Dec
other = Dec -> m Dec
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Dec
other
(Dec -> Q Dec) -> [Dec] -> Q [Dec]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Dec -> Q Dec
forall {m :: * -> *}. Monad m => Dec -> m Dec
mangleForeign ([Dec] -> Q [Dec]) -> Q [Dec] -> Q [Dec]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Q [Dec]
decls