1
0
forked from GitHub/gf-core

added exprSize in the Haskell binding

This commit is contained in:
Krasimir Angelov
2017-09-05 09:50:29 +02:00
parent a5fe5b9378
commit 85cf2d9f5a
4 changed files with 47 additions and 2 deletions

View File

@@ -1177,6 +1177,39 @@ pgf_expr_hash(GuHash h, PgfExpr e)
return h;
}
PGF_API size_t
pgf_expr_size(PgfExpr expr)
{
GuVariantInfo ei = gu_variant_open(expr);
switch (ei.tag) {
case PGF_EXPR_ABS: {
PgfExprAbs* abs = ei.data;
return pgf_expr_size(abs->body);
}
case PGF_EXPR_APP: {
PgfExprApp* app = ei.data;
return pgf_expr_size(app->fun) + pgf_expr_size(app->arg);
}
case PGF_EXPR_LIT:
case PGF_EXPR_META:
case PGF_EXPR_FUN:
case PGF_EXPR_VAR: {
return 1;
}
case PGF_EXPR_TYPED: {
PgfExprTyped* typed = ei.data;
return pgf_expr_size(typed->expr);
}
case PGF_EXPR_IMPL_ARG: {
PgfExprImplArg* impl = ei.data;
return pgf_expr_size(impl->expr);
}
default:
gu_impossible();
return 0;
}
}
PGF_API void
pgf_print_cid(PgfCId id,
GuOut* out, GuExn* err)

View File

@@ -197,6 +197,9 @@ pgf_literal_hash(GuHash h, PgfLiteral lit);
PGF_API_DECL GuHash
pgf_expr_hash(GuHash h, PgfExpr e);
PGF_API size_t
pgf_expr_size(PgfExpr expr);
typedef struct PgfPrintContext PgfPrintContext;
struct PgfPrintContext {

View File

@@ -39,7 +39,7 @@ module PGF2 (-- * PGF
mkFloat,unFloat,
mkMeta,unMeta,
mkCId,
exprHash,
exprHash, exprSize,
treeProbability,
-- ** Types
@@ -331,7 +331,13 @@ exprHash h (Expr c_expr touch1) =
touch1
return (fromIntegral h)
exprSize :: Expr -> Int32
exprSize (Expr c_expr touch1) =
unsafePerformIO $ do
size <- pgf_expr_size c_expr
touch1
return (fromIntegral size)
-----------------------------------------------------------------------------
-- Graphviz

View File

@@ -331,6 +331,9 @@ foreign import ccall "pgf/expr.h pgf_expr_eq"
foreign import ccall "pgf/expr.h pgf_expr_hash"
pgf_expr_hash :: Word -> PgfExpr -> IO Word
foreign import ccall "pgf/expr.h pgf_expr_size"
pgf_expr_size :: PgfExpr -> IO CInt
foreign import ccall "pgf/expr.h pgf_compute_tree_probability"
pgf_compute_tree_probability :: Ptr PgfPGF -> PgfExpr -> IO CFloat