[Fencommits] fenfire-hs: rdf code twids
Benja Fallenstein
benja.fallenstein at gmail.com
Fri Mar 16 23:39:09 EET 2007
Fri Mar 16 23:38:13 EET 2007 Benja Fallenstein <benja.fallenstein at gmail.com>
* rdf code twids
diff -rN -u old-fenfire-hs/Fenfire/RDF.hs new-fenfire-hs/Fenfire/RDF.hs
--- old-fenfire-hs/Fenfire/RDF.hs 2007-03-16 23:39:08.000000000 +0200
+++ new-fenfire-hs/Fenfire/RDF.hs 2007-03-16 23:39:08.000000000 +0200
@@ -1,4 +1,4 @@
-{-# OPTIONS_GHC -fglasgow-exts #-}
+{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-}
module Fenfire.RDF where
-- Copyright (c) 2006-2007, Benja Fallenstein, Tuukka Hastrup
@@ -24,9 +24,9 @@
import qualified Fenfire.Raptor as Raptor
import Control.Monad.Writer (Writer, WriterT, MonadWriter, tell, forM_,
- runWriter)
+ runWriter, runWriterT)
import Control.Monad.Reader (Reader, ask, runReader)
-import Control.Monad.State (State, get, put, modify)
+import Control.Monad.State (State, get, put, modify, runState)
import Data.List (intersperse)
import Data.Map (Map)
@@ -236,17 +236,24 @@
type FromRdfM = Writer (Set Triple)
-class FromRDF a where
+class FromRDF a where -- minimal impl: either fromRDF or readRDF
fromRDF :: Graph -> Node -> a
- fromRDF g n = fst $ runWriter (readRDF g n)
+ 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
+runFromRDF :: FromRdfM a -> (a, Set Triple)
+runFromRDF = runWriter
+
type ToRdfM = WriterT (Set Triple) (State (String, Int))
+
+runToRDF :: String -> ToRdfM a -> (a, Set Triple)
+runToRDF gid m = fst $ runState (runWriterT m) (gid, 1)
newBNode :: ToRdfM Node
newBNode = do (gid, i) <- get; put (gid, i+1); return $ BNode gid (show i)
@@ -274,6 +281,13 @@
, (l, rdf_first, first)
, (l, rdf_next, next) ]
return l
+
+instance FromRDF String where
+ fromRDF _ (Literal s _) = 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)
--------------------------------------------------------------------------
More information about the Fencommits
mailing list