Skip to content

Commit

Permalink
Added Data.RDF.State for easier manipulation of graph with StateT Monad.
Browse files Browse the repository at this point in the history
  • Loading branch information
koslambrou committed Apr 25, 2021
1 parent 0bf1dc3 commit ebb9896
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 0 deletions.
1 change: 1 addition & 0 deletions rdf4h.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ library
, Data.RDF.Graph.AdjHashMap
, Data.RDF.Graph.AlgebraicGraph
, Data.RDF.Graph.TList
, Data.RDF.State
, Data.RDF.Vocabulary.Generator.VocabularyGenerator
, Data.RDF.Vocabulary.DCTerms
, Data.RDF.Vocabulary.OWL
Expand Down
140 changes: 140 additions & 0 deletions src/Data/RDF/State.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Data.RDF.State where

import Control.Monad.State
import Data.RDF (RDF, Rdf, PrefixMappings, BaseUrl, Triples, Triple, NodeSelector)
import qualified Data.RDF as RDF

-- | StateT monad which allows to combine more easily functions from 'Rdf'
-- typeclass, eg.:
--
-- @
-- import Data.RDF
-- import qualified Data.RDF.State as RDFS
--
-- main :: IO ()
-- main = do
-- let myEmptyGraph = empty :: RDF TList
-- newGraph <- execStateT (unRdfST createGraph) myEmptyGraph
-- putStrLn (showGraph newGraph)
--
-- createGraph :: (Rdf rdfImpl, Monad m) => RdfST rdfImpl m ()
-- createGraph = do
-- -- add a triple to the empty graph
-- let triple1 = triple (unode "http://www.example.com/rob")
-- (unode "http://xmlns.com/foaf/0.1/interest")
-- (unode "http://dbpedia.org/resource/Scotch_whisky")
-- RDFS.addTriple triple1
--
-- -- add another triple to the graph
-- let triple2 = triple (unode "http://www.example.com/rob")
-- (unode "http://xmlns.com/foaf/0.1/interest")
-- (unode "http://dbpedia.org/resource/Haskell_(programming_language)")
-- RDFS.addTriple triple2
--
-- -- remove one of my interests
-- RDFS.removeTriple triple1
-- @
newtype RdfST rdfImpl m a = RdfST { unRdfST :: StateT (RDF rdfImpl) m a }
deriving
( Functor,
Applicative,
Monad,
MonadState (RDF rdfImpl),
MonadTrans,
MonadIO
)

-- | Same as 'Data.RDF.Types.baseUrl'
baseUrl
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m (Maybe BaseUrl)
baseUrl = gets RDF.baseUrl

-- | Same as 'Data.RDF.Types.prefixMappings'
prefixMappings
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m PrefixMappings
prefixMappings = gets RDF.prefixMappings

-- | Same as 'Data.RDF.Types.addPrefixMappings', but with the Bool arg as False
addPrefixMappings
:: (Rdf rdfImpl, Monad m)
=> PrefixMappings
-> RdfST rdfImpl m ()
addPrefixMappings mappings =
get >>= \graph -> put $ RDF.addPrefixMappings graph mappings False

-- | Same as 'Data.RDF.Types.addPrefixMappings', but with the Bool arg as True
replacePrefixMappings
:: (Rdf rdfImpl, Monad m)
=> PrefixMappings
-> RdfST rdfImpl m ()
replacePrefixMappings mappings =
get >>= \graph -> put $ RDF.addPrefixMappings graph mappings True

-- | Same as 'Data.RDF.Types.empty'
empty
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m ()
empty = put RDF.empty

-- | Same as 'Data.RDF.Types.mkRdf'
mkRdf
:: (Rdf rdfImpl, Monad m)
=> Triples
-> Maybe BaseUrl
-> PrefixMappings
-> RdfST rdfImpl m ()
mkRdf triples baseUrlMaybe mappings =
put $ RDF.mkRdf triples baseUrlMaybe mappings

-- | Same as 'Data.RDF.Types.addTriple'
addTriple
:: (Rdf rdfImpl, Monad m)
=> Triple -> RdfST rdfImpl m ()
addTriple triple = get >>= \graph -> put $ RDF.addTriple graph triple

-- | Same as 'Data.RDF.Types.removeTriple'
removeTriple
:: (Rdf rdfImpl, Monad m)
=> Triple -> RdfST rdfImpl m ()
removeTriple triple = get >>= \graph -> put $ RDF.removeTriple graph triple

-- | Same as 'Data.RDF.Types.triplesOf'
triplesOf
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m Triples
triplesOf = gets RDF.triplesOf

-- | Same as 'Data.RDF.Types.uniqTriplesOf'
uniqTriplesOf
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m Triples
uniqTriplesOf = gets RDF.uniqTriplesOf

-- | Same as 'Data.RDF.Types.select'
select
:: (Rdf rdfImpl, Monad m)
=> NodeSelector
-> NodeSelector
-> NodeSelector
-> RdfST rdfImpl m Triples
select s p o = get >>= \graph -> return $ RDF.select graph s p o

-- | Same as 'Data.RDF.Types.query'
query
:: (Rdf rdfImpl, Monad m)
=> Maybe RDF.Node
-> Maybe RDF.Node
-> Maybe RDF.Node
-> RdfST rdfImpl m Triples
query s p o = get >>= \graph -> return $ RDF.query graph s p o

-- | Same as 'Data.RDF.Types.showGraph'
showGraph
:: (Rdf rdfImpl, Monad m)
=> RdfST rdfImpl m String
showGraph = gets RDF.showGraph

0 comments on commit ebb9896

Please sign in to comment.