forked from GitHub/gf-core
add unStr,unInt and unFloat in the Haskell binding
This commit is contained in:
@@ -30,7 +30,7 @@ module PGF2 (-- * PGF
|
|||||||
-- ** Functions
|
-- ** Functions
|
||||||
Fun,functions, functionsByCat, functionType, hasLinearization,
|
Fun,functions, functionsByCat, functionType, hasLinearization,
|
||||||
-- ** Expressions
|
-- ** Expressions
|
||||||
Expr,showExpr,readExpr,mkApp,unApp,mkStr,mkInt,mkFloat,
|
Expr,showExpr,readExpr,mkApp,unApp,mkStr,unStr,mkInt,unInt,mkFloat,unFloat,
|
||||||
-- ** Types
|
-- ** Types
|
||||||
Type(..), Hypo, BindType(..), showType,
|
Type(..), Hypo, BindType(..), showType,
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,16 @@ mkStr str =
|
|||||||
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
||||||
return (Expr c_expr exprFPl)
|
return (Expr c_expr exprFPl)
|
||||||
|
|
||||||
|
-- | Decomposes an expression into a string literal
|
||||||
|
unStr :: Expr -> Maybe String
|
||||||
|
unStr (Expr expr master) =
|
||||||
|
unsafePerformIO $ do
|
||||||
|
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_STR)
|
||||||
|
if plit == nullPtr
|
||||||
|
then return Nothing
|
||||||
|
else do s <- peekUtf8CString (plit `plusPtr` (#offset PgfLiteralStr, val))
|
||||||
|
return (Just s)
|
||||||
|
|
||||||
-- | Constructs an expression from an integer literal
|
-- | Constructs an expression from an integer literal
|
||||||
mkInt :: Int -> Expr
|
mkInt :: Int -> Expr
|
||||||
mkInt val =
|
mkInt val =
|
||||||
@@ -82,6 +92,16 @@ mkInt val =
|
|||||||
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
||||||
return (Expr c_expr exprFPl)
|
return (Expr c_expr exprFPl)
|
||||||
|
|
||||||
|
-- | Decomposes an expression into an integer literal
|
||||||
|
unInt :: Expr -> Maybe Int
|
||||||
|
unInt (Expr expr master) =
|
||||||
|
unsafePerformIO $ do
|
||||||
|
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_INT)
|
||||||
|
if plit == nullPtr
|
||||||
|
then return Nothing
|
||||||
|
else do n <- peek (plit `plusPtr` (#offset PgfLiteralInt, val))
|
||||||
|
return (Just (fromIntegral (n :: CInt)))
|
||||||
|
|
||||||
-- | Constructs an expression from a real number
|
-- | Constructs an expression from a real number
|
||||||
mkFloat :: Double -> Expr
|
mkFloat :: Double -> Expr
|
||||||
mkFloat val =
|
mkFloat val =
|
||||||
@@ -91,6 +111,16 @@ mkFloat val =
|
|||||||
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
exprFPl <- newForeignPtr gu_pool_finalizer exprPl
|
||||||
return (Expr c_expr exprFPl)
|
return (Expr c_expr exprFPl)
|
||||||
|
|
||||||
|
-- | Decomposes an expression into a real number literal
|
||||||
|
unFloat :: Expr -> Maybe Double
|
||||||
|
unFloat (Expr expr master) =
|
||||||
|
unsafePerformIO $ do
|
||||||
|
plit <- pgf_expr_unlit expr (#const PGF_LITERAL_FLT)
|
||||||
|
if plit == nullPtr
|
||||||
|
then return Nothing
|
||||||
|
else do n <- peek (plit `plusPtr` (#offset PgfLiteralFlt, val))
|
||||||
|
return (Just (realToFrac (n :: CDouble)))
|
||||||
|
|
||||||
-- | parses a 'String' as an expression
|
-- | parses a 'String' as an expression
|
||||||
readExpr :: String -> Maybe Expr
|
readExpr :: String -> Maybe Expr
|
||||||
readExpr str =
|
readExpr str =
|
||||||
|
|||||||
@@ -266,6 +266,9 @@ foreign import ccall "pgf/pgf.h pgf_expr_int"
|
|||||||
foreign import ccall "pgf/pgf.h pgf_expr_float"
|
foreign import ccall "pgf/pgf.h pgf_expr_float"
|
||||||
pgf_expr_float :: CDouble -> Ptr GuPool -> IO PgfExpr
|
pgf_expr_float :: CDouble -> Ptr GuPool -> IO PgfExpr
|
||||||
|
|
||||||
|
foreign import ccall "pgf/pgf.h pgf_expr_unlit"
|
||||||
|
pgf_expr_unlit :: PgfExpr -> CInt -> IO (Ptr a)
|
||||||
|
|
||||||
foreign import ccall "pgf/pgf.h pgf_expr_unapply"
|
foreign import ccall "pgf/pgf.h pgf_expr_unapply"
|
||||||
pgf_expr_unapply :: PgfExpr -> Ptr GuPool -> IO (Ptr PgfApplication)
|
pgf_expr_unapply :: PgfExpr -> Ptr GuPool -> IO (Ptr PgfApplication)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user