{-# Language OverloadedStrings #-}

--------------------------------------------------------------------------------
--  See end of this file for licence information.
--------------------------------------------------------------------------------
-- |
--  Module      :  Swish.RDF.Vocabulary.RDF
--  Copyright   :  (c) 2003, Graham Klyne, 2009 Vasili I Galchin, 2011 Douglas Burke
--  License     :  GPL V2
--
--  Maintainer  :  Douglas Burke
--  Stability   :  experimental
--  Portability :  OverloadedStrings
--
--  This module defines some commonly used vocabulary terms from the
--  RDF (<http://www.w3.org/TR/rdf-syntax-grammar/>) and
--  RDF Schema (<http://www.w3.org/TR/rdf-schema/>) documents.
--
--------------------------------------------------------------------------------

module Swish.RDF.Vocabulary.RDF
    ( 
      -- * Namespaces
      
      namespaceRDF
    , namespaceRDFS
    
    -- * RDF terms                                          
    --                                          
    -- | These terms are described in <http://www.w3.org/TR/rdf-syntax-grammar/>;                                          
    -- the version used is \"W3C Recommendation 10 February 2004\", <http://www.w3.org/TR/2004/REC-rdf-syntax-grammar-20040210/>.
    --                                          
    -- Some terms are listed within the RDF Schema terms below since their definition                                            
    -- is given within the RDF Schema document.                                          
    --                                          
    , rdfRDF                                          
    , rdfDescription      
    , rdfID
    , rdfAbout
    , rdfParseType
    , rdfResource
    , rdfLi
    , rdfNodeID
    , rdfDatatype
    , rdf1, rdf2, rdfn
    -- * RDF Schema terms
    --
    -- | These are defined by <http://www.w3.org/TR/rdf-schema/>; the version
    -- used is \"W3C Recommendation 10 February 2004\", <http://www.w3.org/TR/2004/REC-rdf-schema-20040210/>.
                  
    -- ** Classes
    --
    -- | See the \"Classes\" section at <http://www.w3.org/TR/rdf-schema/#ch_classes> for more information.
    , rdfsResource
    , rdfsClass
    , rdfsLiteral
    , rdfsDatatype
    , rdfXMLLiteral
    , rdfProperty
    
    -- ** Properties
    --                                 
    -- | See the \"Properties\" section at <http://www.w3.org/TR/rdf-schema/#ch_classes> for more information.
    , rdfsRange
    , rdfsDomain
    , rdfType
    , rdfsSubClassOf
    , rdfsSubPropertyOf
    , rdfsLabel
    , rdfsComment
    -- ** Containers
    --
    -- | See the \"Container Classes and Properties\" section at <http://www.w3.org/TR/rdf-schema/#ch_containervocab>.
    , rdfsContainer
    , rdfBag
    , rdfSeq                                 
    , rdfAlt  
    , rdfsContainerMembershipProperty
    , rdfsMember
    -- ** Collections
    --
    -- | See the \"Collections\" section at <http://www.w3.org/TR/rdf-schema/#ch_collectionvocab>.
    , rdfList    
    , rdfFirst
    , rdfRest 
    , rdfNil 
    -- ** Reification Vocabulary 
    --  
    -- | See the \"Reification Vocabulary\" section at <http://www.w3.org/TR/rdf-schema/#ch_reificationvocab>.
    , rdfStatement  
    , rdfSubject  
    , rdfPredicate  
    , rdfObject  
    -- ** Utility Properties 
    --  
    -- | See the \"Utility Properties\" section at <http://www.w3.org/TR/rdf-schema/#ch_utilvocab>.
    , rdfsSeeAlso
    , rdfsIsDefinedBy
    , rdfValue  
      
    )
where

import Swish.Namespace (Namespace, makeNamespace, ScopedName, makeNSScopedName)
import Swish.QName (LName, newLName)

import Data.Maybe (fromMaybe, fromJust)
import Data.Word (Word32)

import Network.URI (URI, parseURI)

import qualified Data.Text as T

------------------------------------------------------------
--  Namespaces
------------------------------------------------------------

rdfURI, rdfsURI :: URI
rdfURI :: URI
rdfURI = forall a. a -> Maybe a -> a
fromMaybe (forall a. HasCallStack => [Char] -> a
error [Char]
"Internal error processing RDF URI") forall a b. (a -> b) -> a -> b
$ [Char] -> Maybe URI
parseURI [Char]
"http://www.w3.org/1999/02/22-rdf-syntax-ns#"
rdfsURI :: URI
rdfsURI = forall a. a -> Maybe a -> a
fromMaybe (forall a. HasCallStack => [Char] -> a
error [Char]
"Internal error processing RDFS URI") forall a b. (a -> b) -> a -> b
$ [Char] -> Maybe URI
parseURI [Char]
"http://www.w3.org/2000/01/rdf-schema#"

-- | Maps @rdf@ to <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
namespaceRDF :: Namespace
namespaceRDF :: Namespace
namespaceRDF = Maybe Text -> URI -> Namespace
makeNamespace (forall a. a -> Maybe a
Just Text
"rdf") URI
rdfURI

-- | Maps @rdfs@ to <http://www.w3.org/2000/01/rdf-schema#>.
namespaceRDFS :: Namespace
namespaceRDFS :: Namespace
namespaceRDFS = Maybe Text -> URI -> Namespace
makeNamespace (forall a. a -> Maybe a
Just Text
"rdfs") URI
rdfsURI

------------------------------------------------------------
--  Terms
------------------------------------------------------------

toRDF, toRDFS :: LName -> ScopedName
toRDF :: LName -> ScopedName
toRDF  = Namespace -> LName -> ScopedName
makeNSScopedName Namespace
namespaceRDF
toRDFS :: LName -> ScopedName
toRDFS = Namespace -> LName -> ScopedName
makeNSScopedName Namespace
namespaceRDFS

-- | @rdf:RDF@.
rdfRDF :: ScopedName
rdfRDF :: ScopedName
rdfRDF = LName -> ScopedName
toRDF LName
"RDF"

-- | @rdf:Description@.
rdfDescription :: ScopedName
rdfDescription :: ScopedName
rdfDescription = LName -> ScopedName
toRDF LName
"Description"
  
-- | @rdf:datatype@.
rdfDatatype   :: ScopedName
rdfDatatype :: ScopedName
rdfDatatype   = LName -> ScopedName
toRDF LName
"datatype"

-- | @rdf:resource@.
rdfResource   :: ScopedName
rdfResource :: ScopedName
rdfResource   = LName -> ScopedName
toRDF LName
"resource"

-- | @rdf:about@.
rdfAbout      :: ScopedName
rdfAbout :: ScopedName
rdfAbout      = LName -> ScopedName
toRDF LName
"about"

-- | @rdf:ID@.
rdfID         :: ScopedName
rdfID :: ScopedName
rdfID         = LName -> ScopedName
toRDF LName
"ID"

-- | @rdf:parseType@.
rdfParseType :: ScopedName
rdfParseType :: ScopedName
rdfParseType = LName -> ScopedName
toRDF LName
"parseType"

-- | @rdf:li@.
rdfLi :: ScopedName
rdfLi :: ScopedName
rdfLi = LName -> ScopedName
toRDF LName
"li"

-- | @rdf:nodeID@.
rdfNodeID :: ScopedName
rdfNodeID :: ScopedName
rdfNodeID = LName -> ScopedName
toRDF LName
"nodeID"

-- | Create a @rdf:_n@ entity.
--
-- There is no check that the argument is not 0, so it is
-- possible to create the un-defined label @rdf:_0@.
rdfn :: 
    Word32
    -> ScopedName
rdfn :: Word32 -> ScopedName
rdfn = LName -> ScopedName
toRDF forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. HasCallStack => Maybe a -> a
fromJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Maybe LName
newLName forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Text
T.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Char]
"_" forall a. [a] -> [a] -> [a]
++) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> [Char]
show

-- | @rdf:_1@.
rdf1 :: ScopedName
rdf1 :: ScopedName
rdf1 = LName -> ScopedName
toRDF LName
"_1"

-- | @rdf:_2@.
rdf2 :: ScopedName
rdf2 :: ScopedName
rdf2 = LName -> ScopedName
toRDF LName
"_2"

-- | @rdf:first@ from <http://www.w3.org/TR/rdf-schema/#ch_first>.
rdfFirst      :: ScopedName
rdfFirst :: ScopedName
rdfFirst      = LName -> ScopedName
toRDF LName
"first"

-- | @rdf:rest@ from <http://www.w3.org/TR/rdf-schema/#ch_rest>.
rdfRest       :: ScopedName
rdfRest :: ScopedName
rdfRest       = LName -> ScopedName
toRDF LName
"rest"

-- | @rdf:nil@ from <http://www.w3.org/TR/rdf-schema/#ch_nil>.
rdfNil        :: ScopedName
rdfNil :: ScopedName
rdfNil        = LName -> ScopedName
toRDF LName
"nil"

-- | @rdf:type@ from <http://www.w3.org/TR/rdf-schema/#ch_type>.
rdfType       :: ScopedName
rdfType :: ScopedName
rdfType       = LName -> ScopedName
toRDF LName
"type"

-- | @rdf:Property@ from <http://www.w3.org/TR/rdf-schema/#ch_property>.
rdfProperty   :: ScopedName
rdfProperty :: ScopedName
rdfProperty   = LName -> ScopedName
toRDF LName
"Property"

-- | @rdf:XMLLiteral@ from <http://www.w3.org/TR/rdf-schema/#ch_xmlliteral>.
rdfXMLLiteral :: ScopedName
rdfXMLLiteral :: ScopedName
rdfXMLLiteral = LName -> ScopedName
toRDF LName
"XMLLiteral"

-- | @rdfs:Resource@ from <http://www.w3.org/TR/rdf-schema/#ch_resource>.
rdfsResource :: ScopedName
rdfsResource :: ScopedName
rdfsResource = LName -> ScopedName
toRDFS LName
"Resource"

-- | @rdfs:Class@ from <http://www.w3.org/TR/rdf-schema/#ch_class>.
rdfsClass :: ScopedName
rdfsClass :: ScopedName
rdfsClass = LName -> ScopedName
toRDFS LName
"Class"

-- | @rdfs:Literal@ from <http://www.w3.org/TR/rdf-schema/#ch_literal>.
rdfsLiteral :: ScopedName
rdfsLiteral :: ScopedName
rdfsLiteral = LName -> ScopedName
toRDFS LName
"Literal"

-- | @rdfs:Datatype@ from <http://www.w3.org/TR/rdf-schema/#ch_datatype>.
rdfsDatatype :: ScopedName
rdfsDatatype :: ScopedName
rdfsDatatype = LName -> ScopedName
toRDFS LName
"Datatype"

-- | @rdfs:label@ from <http://www.w3.org/TR/rdf-schema/#ch_label>.
rdfsLabel :: ScopedName
rdfsLabel :: ScopedName
rdfsLabel = LName -> ScopedName
toRDFS LName
"label"

-- | @rdfs:comment@ from <http://www.w3.org/TR/rdf-schema/#ch_comment>.
rdfsComment :: ScopedName
rdfsComment :: ScopedName
rdfsComment = LName -> ScopedName
toRDFS LName
"comment"

-- | @rdfs:range@ from <http://www.w3.org/TR/rdf-schema/#ch_range>.
rdfsRange :: ScopedName
rdfsRange :: ScopedName
rdfsRange = LName -> ScopedName
toRDFS LName
"range"

-- | @rdfs:domain@ from <http://www.w3.org/TR/rdf-schema/#ch_domain>.
rdfsDomain :: ScopedName
rdfsDomain :: ScopedName
rdfsDomain = LName -> ScopedName
toRDFS LName
"domain"

-- | @rdfs:subClassOf@ from <http://www.w3.org/TR/rdf-schema/#ch_subclassof>.
rdfsSubClassOf :: ScopedName
rdfsSubClassOf :: ScopedName
rdfsSubClassOf = LName -> ScopedName
toRDFS LName
"subClassOf"

-- | @rdfs:subPropertyOf@ from <http://www.w3.org/TR/rdf-schema/#ch_subpropertyof>.
rdfsSubPropertyOf :: ScopedName
rdfsSubPropertyOf :: ScopedName
rdfsSubPropertyOf = LName -> ScopedName
toRDFS LName
"subPropertyOf"

-- | @rdfs:Container@ from <http://www.w3.org/TR/rdf-schema/#ch_container>.
rdfsContainer :: ScopedName
rdfsContainer :: ScopedName
rdfsContainer = LName -> ScopedName
toRDFS LName
"Container"

-- | @rdf:Bag@ from <http://www.w3.org/TR/rdf-schema/#ch_bag>.
rdfBag :: ScopedName
rdfBag :: ScopedName
rdfBag = LName -> ScopedName
toRDF LName
"Bag"

-- | @rdf:Seq@ from <http://www.w3.org/TR/rdf-schema/#ch_seq>.
rdfSeq :: ScopedName
rdfSeq :: ScopedName
rdfSeq = LName -> ScopedName
toRDF LName
"Seq"

-- | @rdf:Alt@ from <http://www.w3.org/TR/rdf-schema/#ch_alt>.
rdfAlt :: ScopedName
rdfAlt :: ScopedName
rdfAlt = LName -> ScopedName
toRDF LName
"Alt"

-- | @rdfs:ContainerMembershipProperty@ from <http://www.w3.org/TR/rdf-schema/#ch_containermembershipproperty>.
rdfsContainerMembershipProperty :: ScopedName
rdfsContainerMembershipProperty :: ScopedName
rdfsContainerMembershipProperty = LName -> ScopedName
toRDFS LName
"ContainerMembershipProperty"

-- | @rdfs:member@ from <http://www.w3.org/TR/rdf-schema/#ch_member>.
rdfsMember :: ScopedName
rdfsMember :: ScopedName
rdfsMember    = LName -> ScopedName
toRDFS LName
"member"

-- | @rdf:List@ from <http://www.w3.org/TR/rdf-schema/#ch_list>.
rdfList :: ScopedName
rdfList :: ScopedName
rdfList = LName -> ScopedName
toRDF LName
"List"

-- | @rdf:Statement@ from <http://www.w3.org/TR/rdf-schema/#ch_statement>.
rdfStatement :: ScopedName
rdfStatement :: ScopedName
rdfStatement = LName -> ScopedName
toRDF LName
"Statement"

-- | @rdf:subject@ from <http://www.w3.org/TR/rdf-schema/#ch_subject>.
rdfSubject :: ScopedName
rdfSubject :: ScopedName
rdfSubject = LName -> ScopedName
toRDF LName
"subject"

-- | @rdf:predicate@ from <http://www.w3.org/TR/rdf-schema/#ch_predicate>.
rdfPredicate :: ScopedName
rdfPredicate :: ScopedName
rdfPredicate = LName -> ScopedName
toRDF LName
"subject"

-- | @rdf:object@ from <http://www.w3.org/TR/rdf-schema/#ch_object>.
rdfObject :: ScopedName
rdfObject :: ScopedName
rdfObject = LName -> ScopedName
toRDF LName
"object"

-- | @rdfs:seeAlso@ from <http://www.w3.org/TR/rdf-schema/#ch_seealso>.
rdfsSeeAlso :: ScopedName
rdfsSeeAlso :: ScopedName
rdfsSeeAlso = LName -> ScopedName
toRDFS LName
"seeAlso"

-- | @rdfs:isDefinedBy@ from <http://www.w3.org/TR/rdf-schema/#ch_isdefinedby>.
rdfsIsDefinedBy :: ScopedName
rdfsIsDefinedBy :: ScopedName
rdfsIsDefinedBy = LName -> ScopedName
toRDFS LName
"isDefinedBy"

-- | @rdf:value@ from <http://www.w3.org/TR/rdf-schema/#ch_value>.
rdfValue :: ScopedName
rdfValue :: ScopedName
rdfValue = LName -> ScopedName
toRDF LName
"value"

--------------------------------------------------------------------------------
--
--  Copyright (c) 2011 Douglas Burke
--  All rights reserved.
--
--  This file is part of Swish.
--
--  Swish is free software; you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation; either version 2 of the License, or
--  (at your option) any later version.
--
--  Swish is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with Swish; if not, write to:
--    The Free Software Foundation, Inc.,
--    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
--
--------------------------------------------------------------------------------