[Fencommits] fenfire-hs: simplify FromRDF and ToRDF a bit

Benja Fallenstein benja.fallenstein at gmail.com
Wed Apr 4 19:18:53 EEST 2007


Wed Apr  4 19:18:24 EEST 2007  Benja Fallenstein <benja.fallenstein at gmail.com>
  * simplify FromRDF and ToRDF a bit
diff -rN -u old-fenfire-hs-1/Fenfire/RDF.hs new-fenfire-hs-1/Fenfire/RDF.hs
--- old-fenfire-hs-1/Fenfire/RDF.hs	2007-04-04 19:18:52.000000000 +0300
+++ new-fenfire-hs-1/Fenfire/RDF.hs	2007-04-04 19:18:52.000000000 +0300
@@ -244,53 +244,44 @@
 -- FromRDF and ToRDF
 --------------------------------------------------------------------------
 
+{-
 updateRDF :: (FromRDF a, ToRDF a) => Endo a -> Node -> Endo Graph
 updateRDF f node graph = graph' where
     (x, ts) = runFromRDF $ readRDF graph node
     (_, ts') = runToRDF (iriStr $ defaultGraph graph) $ toRDF (f x)
     graph' = flip (foldr insert) (Set.toAscList ts') $
              foldr delete graph (Set.toAscList ts)
+-}
 
-type FromRdfM = Writer (Set Triple)
-
-class FromRDF a where -- minimal impl: either fromRDF or readRDF
-    fromRDF :: Graph -> Node -> a
-    fromRDF g n = fst $ runFromRDF (readRDF g n)
-    
-    -- Return a value read from a graph and the triples
-    -- that were used in getting that value. When updating
-    -- a value in a graph, these triples will be replaced
-    -- by the triples generated by toRDF.
-    readRDF :: Graph -> Node -> FromRdfM a
-    readRDF g n = return $ fromRDF g n
+class FromRDF a where
+    fromRDF :: Graph -> Node -> Either String a
     
-runFromRDF :: FromRdfM a -> (a, Set Triple)
-runFromRDF = runWriter
-
-type ToRdfM = WriterT (Set Triple) (State (String, Int))
+type ToRdfM = State Graph
 
-runToRDF :: String -> ToRdfM a -> (a, Set Triple)
-runToRDF gid m = fst $ runState (runWriterT m) (gid, 1)
+runToRDF :: Node -> ToRdfM Node -> (Node, Graph)
+runToRDF graphNode m = runState m (emptyGraph graphNode)
     
 newBNode :: ToRdfM Node
-newBNode = do (gid, i) <- get; put (gid, i+1); return $ BNode gid (show i)
+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)
 
-tellTs :: (MonadWriter (Set Triple) m) => [Triple] -> m ()
-tellTs = tell . Set.fromList
+tellTs :: [Triple] -> ToRdfM ()
+tellTs ts = modify (\g -> foldr insert g ts)
 
 class ToRDF a where
     toRDF :: a -> ToRdfM Node
     
 instance FromRDF a => FromRDF [a] where
-    readRDF g l = readRDFList readRDF g l
+    fromRDF g l = fromRDFList fromRDF g l
     
-readRDFList f g l | l == rdf_nil = return []
+fromRDFList f g l | l == rdf_nil = return []
                   | otherwise    = do
         first <- mquery (l, rdf_first, X) g
         rest <- mquery (l, rdf_next, X) g
-        tellTs [ (l, rdf_first, first), (l, rdf_next, rest) ]
         x  <- f g first
-        xs <- readRDFList f g rest
+        xs <- fromRDFList f g rest
         return (x:xs)
             
 instance ToRDF a => ToRDF [a] where
@@ -303,14 +294,14 @@
                         return l
 
 instance FromRDF String where
-    fromRDF _ (Literal s _) = s
+    fromRDF _ (Literal s _) = return s
     fromRDF _ n = error $ "Fenfire.RDF.fromRDF(String): can only convert literals, not " ++ show n
     
 instance ToRDF String where
     toRDF s = return (Literal s Plain)
     
 instance FromRDF Node where
-    fromRDF _ n = n
+    fromRDF _ n = return n
     
 instance ToRDF Node where
     toRDF n = return n




More information about the Fencommits mailing list