[Fencommits] fenfire-hs: refactor RDF.hs a bit
Benja Fallenstein
benja.fallenstein at gmail.com
Sun Feb 18 18:06:27 EET 2007
Sun Feb 18 18:05:53 EET 2007 Benja Fallenstein <benja.fallenstein at gmail.com>
* refactor RDF.hs a bit
diff -rN -u old-fenfire-hs/Fenfire.fhs new-fenfire-hs/Fenfire.fhs
--- old-fenfire-hs/Fenfire.fhs 2007-02-18 18:06:25.000000000 +0200
+++ new-fenfire-hs/Fenfire.fhs 2007-02-18 18:06:26.000000000 +0200
@@ -116,7 +116,7 @@
f (PlainLiteral s) = s; f _ = error "getText argh"
getTextOrURI :: Graph -> Node -> String
-getTextOrURI g n = fromMaybe (showNode (getNamespaces g) n) (getText g n)
+getTextOrURI g n = fromMaybe (showNode (graphNamespaces g) n) (getText g n)
setText :: Graph -> Node -> String -> Graph
setText g n t = update (n, rdfs_label, PlainLiteral t) g
@@ -378,7 +378,7 @@
f (URI s) = Raptor.Uri s
f (PlainLiteral s) = Raptor.Literal s
triples = graphToList graph
- namespaces = Map.toAscList $ getNamespaces graph
+ namespaces = Map.toAscList $ graphNamespaces graph
Raptor.triplesToFilename (map convert triples) namespaces fileName
putStrLn $ "Saved: " ++ fileName
diff -rN -u old-fenfire-hs/RDF.hs new-fenfire-hs/RDF.hs
--- old-fenfire-hs/RDF.hs 2007-02-18 18:06:25.000000000 +0200
+++ new-fenfire-hs/RDF.hs 2007-02-18 18:06:25.000000000 +0200
@@ -32,11 +32,29 @@
instance Show Node where
show = showNode defaultNamespaces
+
+
+-- This is unfortunately something of a pun because I can't find a good
+-- name for it: A 'coin' is something that has two sides...
+class Coin c a | c -> a where
+ getSide :: Dir -> c -> a
+
+type CoinPair a = (a,a)
+
+instance Coin (CoinPair a) a where
+ getSide Neg = fst
+ getSide Pos = snd
-type Triple = (Node, Node, Node)
-type Side = Map Node (Map Node (Set Node))
+
+type Triple = (Node, Node, Node)
type Namespaces = Map String String
-data Graph = Graph Namespaces Side Side (Set Triple) deriving (Show, Eq)
+data Graph = Graph {
+ graphNamespaces :: Namespaces,
+ graphSides :: CoinPair (Map Node (Map Node (Set Node))),
+ graphRealTriples :: Set Triple } deriving (Show, Eq)
+
+instance Coin Graph (Map Node (Map Node (Set Node))) where
+ getSide dir graph = getSide dir $ graphSides graph
instance Hashable Node where
hash (URI s) = hash s
@@ -69,12 +87,8 @@
object :: Triple -> Node
object (_,_,o) = o
-graphSide :: Dir -> Graph -> Side
-graphSide Neg (Graph _ s _ _) = s
-graphSide Pos (Graph _ _ s _) = s
-
hasConn :: Graph -> Node -> Node -> Dir -> Bool
-hasConn g node prop dir = isJust $ do m <- Map.lookup node (graphSide dir g)
+hasConn g node prop dir = isJust $ do m <- Map.lookup node (getSide dir g)
Map.lookup prop m
getOne :: Graph -> Node -> Node -> Dir -> Maybe Node
@@ -86,35 +100,33 @@
Map.findWithDefault Set.empty prop $ getConns g node dir
getConns :: Graph -> Node -> Dir -> Map Node (Set Node)
-getConns g node dir = Map.findWithDefault Map.empty node $ graphSide dir g
-
-getNamespaces :: Graph -> Namespaces
-getNamespaces (Graph ns _ _ _) = ns
+getConns g node dir = Map.findWithDefault Map.empty node $ getSide dir g
emptyGraph :: Graph
-emptyGraph = Graph defaultNamespaces (Map.empty) (Map.empty) Set.empty
+emptyGraph = Graph defaultNamespaces (Map.empty, Map.empty) Set.empty
listToGraph :: [Triple] -> Graph
listToGraph = foldr insert emptyGraph
graphToList :: Graph -> [Triple]
-graphToList (Graph _ _ _ triples) = Set.toAscList triples
+graphToList = Set.toAscList . graphRealTriples
mergeGraphs :: Op Graph
mergeGraphs real virtual = foldr insertVirtual real (graphToList virtual)
insert :: Triple -> Endo Graph
-insert t (Graph ns neg pos triples) =
- insertVirtual t (Graph ns neg pos $ Set.insert t triples)
+insert t graph@(Graph { graphRealTriples=ts }) =
+ insertVirtual t $ graph { graphRealTriples = Set.insert t ts }
insertVirtual :: Triple -> Endo Graph
-insertVirtual (s,p,o) (Graph ns neg pos triples) =
- Graph ns (ins o p s neg) (ins s p o pos) triples where
+insertVirtual (s,p,o) graph@(Graph { graphSides = (neg, pos) }) =
+ graph { graphSides = (ins o p s neg, ins s p o pos) } where
ins a b c = Map.alter (Just . Map.alter (Just . Set.insert c . fromMaybe Set.empty) b . fromMaybe Map.empty) a -- Gack!!! Need to make more readable
delete :: Triple -> Endo Graph
-delete (s,p,o) (Graph ns neg pos triples) =
- Graph ns (del o p s neg) (del s p o pos) $ Set.delete (s,p,o) triples where
+delete (s,p,o) (Graph ns (neg, pos) triples) =
+ Graph ns (del o p s neg, del s p o pos) $
+ Set.delete (s,p,o) triples where
del a b c = Map.adjust (Map.adjust (Set.delete c) b) a
deleteAll :: Node -> Node -> Endo Graph
@@ -127,8 +139,8 @@
update (s,p,o) g = insert (s,p,o) $ deleteAll s p g
addNamespace :: String -> String -> Endo Graph
-addNamespace prefix uri (Graph ns neg pos ts) =
- Graph (Map.insert prefix uri ns) neg pos ts
+addNamespace prefix uri g =
+ g { graphNamespaces = Map.insert prefix uri $ graphNamespaces g }
triple :: Dir -> (Node,Node,Node) -> Triple
triple Pos (s,p,o) = (s,p,o)
More information about the Fencommits
mailing list