summaryrefslogtreecommitdiff
path: root/src/runtime/haskell-bind
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/haskell-bind')
-rw-r--r--src/runtime/haskell-bind/PGF2/Expr.hsc16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/runtime/haskell-bind/PGF2/Expr.hsc b/src/runtime/haskell-bind/PGF2/Expr.hsc
index 096d15bfa..85e55ab40 100644
--- a/src/runtime/haskell-bind/PGF2/Expr.hsc
+++ b/src/runtime/haskell-bind/PGF2/Expr.hsc
@@ -6,7 +6,9 @@ import System.IO.Unsafe(unsafePerformIO)
import Foreign hiding (unsafePerformIO)
import Foreign.C
import Data.IORef
+import Data.Data
import PGF2.FFI
+import Data.Maybe(fromJust)
-- | An data type that represents
-- identifiers for functions and categories in PGF.
@@ -42,6 +44,20 @@ instance Eq Expr where
e1_touch >> e2_touch
return (res /= 0)
+instance Data Expr where
+ gfoldl f z e = z (fromJust . readExpr) `f` (showExpr [] e)
+ toConstr _ = readExprConstr
+ gunfold k z c = case constrIndex c of
+ 1 -> k (z (fromJust . readExpr))
+ _ -> error "gunfold"
+ dataTypeOf _ = exprDataType
+
+readExprConstr :: Constr
+readExprConstr = mkConstr exprDataType "(fromJust . readExpr)" [] Prefix
+
+exprDataType :: DataType
+exprDataType = mkDataType "PGF2.Expr" [readExprConstr]
+
-- | Constructs an expression by lambda abstraction
mkAbs :: BindType -> CId -> Expr -> Expr
mkAbs bind_type var (Expr body bodyTouch) =