packages feed

rdf4h-5.0.1: src/Data/RDF/State.hs

{-# 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