[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