[Fencommits] fenfire-hs: add functionality to mint unused fragids in ToRdfM and some functions to add triples to an existing node, corresponding to existing functions that create a new bnode

Benja Fallenstein benja.fallenstein at gmail.com
Thu Apr 5 18:20:52 EEST 2007


Thu Apr  5 18:18:50 EEST 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * add functionality to mint unused fragids in ToRdfM and some functions to add triples to an existing node, corresponding to existing functions that create a new bnode
diff -rN -u old-fenfire-hs/Fenfire/RDF.hs new-fenfire-hs/Fenfire/RDF.hs
--- old-fenfire-hs/Fenfire/RDF.hs	2007-04-05 18:20:52.000000000 +0300
+++ new-fenfire-hs/Fenfire/RDF.hs	2007-04-05 18:20:52.000000000 +0300
@@ -264,11 +264,17 @@
 runToRDF :: Node -> ToRdfM Node -> (Node, Graph)
 runToRDF graphNode m = runState m (emptyGraph graphNode)
     
+nextNode :: (String -> [Node]) -> ToRdfM Node
+nextNode f = do g <- get; return $ f' g (f $ iriStr $ defaultGraph g) where
+    f' g (n:ns) = if not $ or [query (n,Any,Any) g, query (Any,n,Any) g,
+                               query (Any,Any,n) g] then n else f' g ns
+    f' _ [] = error "Fenfire.RDF.nextNode: finite list of choices"
+
 newBNode :: ToRdfM Node
-newBNode = do g <- get; return $ f g (1::Integer) where
-    f g i = if not $ or [query (bnode,Any,Any) g, query (Any,bnode,Any) g,
-                         query (Any,Any,bnode) g] then bnode else f g (i+1)
-        where bnode = BNode (iriStr $ defaultGraph g) ("b" ++ show i)
+newBNode = nextNode $ \uri -> [BNode uri ("b" ++ show i) | i::Integer <- [1..]]
+
+newFrag :: ToRdfM Node
+newFrag = nextNode $ \uri -> [IRI (uri ++ "#" ++ show i) | i::Integer <- [1..]]
 
 tellTs :: [Triple] -> ToRdfM ()
 tellTs ts = modify (\g -> foldr insert g ts)
@@ -302,17 +308,24 @@
     n1 <- query (n, p1, X) g; n2 <- query (n, p2, X) g
     v1 <- f1 g n1; v2 <- f2 g n2; return (v1,v2)
 
+addRDFPair :: Node -> (a -> ToRdfM Node) -> Node -> (b -> ToRdfM Node)
+           -> (a,b) -> Node -> ToRdfM ()
+addRDFPair p1 f1 p2 f2 (x,y) n = do n1 <- f1 x; n2 <- f2 y
+                                    tellTs [(n,p1,n1), (n,p2,n2)]
+
 toRDFPair :: Node -> (a -> ToRdfM Node) -> Node -> (b -> ToRdfM Node)
           -> ((a,b) -> ToRdfM Node)
-toRDFPair p1 f1 p2 f2 (x,y) = do n1 <- f1 x; n2 <- f2 y; n <- newBNode
-                                 tellTs [(n,p1,n1), (n,p2,n2)]; return n
+toRDFPair p1 f1 p2 f2 (x,y) =
+    do n <- newBNode; addRDFPair p1 f1 p2 f2 (x,y) n; return n
                                  
 fromRDFConns :: Node -> FromRdfM a -> FromRdfM [a]
 fromRDFConns p f g n = mapM (f g) $ query (n, p, X) g
 
+addRDFConns :: Node -> (a -> ToRdfM Node) -> [a] -> Node -> ToRdfM ()
+addRDFConns p f xs n = do nodes <- mapM f xs; tellTs [(n,p,n') | n' <- nodes]
+
 toRDFConns :: Node -> (a -> ToRdfM Node) -> ([a] -> ToRdfM Node)
-toRDFConns p f xs = do n <- newBNode; nodes <- mapM f xs
-                       tellTs [(n,p,n') | n' <- nodes]; return n
+toRDFConns p f xs = do n <- newBNode; addRDFConns p f xs n; return n
             
 instance FromRDF String where
     fromRDF _ (Literal s _) = return s




More information about the Fencommits mailing list