summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind/PGF2.hsc
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/haskell-bind/PGF2.hsc')
-rw-r--r--src/runtime/haskell-bind/PGF2.hsc16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/runtime/haskell-bind/PGF2.hsc b/src/runtime/haskell-bind/PGF2.hsc
index 0d1d46be6..733e29c74 100644
--- a/src/runtime/haskell-bind/PGF2.hsc
+++ b/src/runtime/haskell-bind/PGF2.hsc
@@ -39,7 +39,7 @@ module PGF2 (-- * PGF
mkFloat,unFloat,
mkMeta,unMeta,
mkCId,
- exprHash, exprSize, exprFunctions,
+ exprHash, exprSize, exprFunctions, exprSubstitute,
treeProbability,
-- ** Types
@@ -366,6 +366,20 @@ exprFunctions (Expr c_expr touch) =
touch
return funs
+exprSubstitute :: Expr -> [Expr] -> Expr
+exprSubstitute (Expr c_expr touch) meta_values =
+ unsafePerformIO $
+ withGuPool $ \tmpPl -> do
+ c_meta_values <- newSequence (#size PgfExpr) pokeExpr meta_values tmpPl
+ exprPl <- gu_new_pool
+ c_expr <- pgf_expr_substitute c_expr c_meta_values exprPl
+ touch
+ exprFPl <- newForeignPtr gu_pool_finalizer exprPl
+ let touch' = sequence_ (touchForeignPtr exprFPl : map touchExpr meta_values)
+ return (Expr c_expr touch')
+ where
+ pokeExpr ptr (Expr c_expr _) = poke ptr c_expr
+
-----------------------------------------------------------------------------
-- Graphviz