AS.hs revision 090c663fcc1593c66f39a0972326799a672760d5
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceModule : $Header$
81ec673ac5ab1493568d9ef7798b752ab8ee0e61Felix Gabriel ManceCopyright : (c) C. Maeder, Felix Gabriel Mance
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceLicense : GPLv2 or higher, see LICENSE.txt
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceMaintainer : Christian.Maeder@dfki.de
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceStability : provisional
5d801400993c9671010d244646936d8fd435638cChristian MaederPortability : portable
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel ManceOWL 2 Functional Syntax constructs
5d801400993c9671010d244646936d8fd435638cChristian Maeder <http://www.w3.org/TR/2009/REC-owl2-syntax-20091027/#Functional-Style_Syntax>
5d801400993c9671010d244646936d8fd435638cChristian Maeder <http://www.w3.org/TR/owl2-manchester-syntax/>
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederimport Data.Char (intToDigit)
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Manceimport qualified Data.Map as Map
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mancedata IRIType = Full | Abbreviated | NodeID
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance deriving (Show, Eq, Ord)
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance{- | full or abbreviated IRIs with a possible uri for the prefix
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance or a local part following a hash sign -}
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mancedata QName = QN
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance { namePrefix :: String
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance -- ^ the name prefix part of a qualified name \"namePrefix:localPart\"
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance , localPart :: String
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance -- ^ the local part of a qualified name \"namePrefix:localPart\"
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel Mance , iriType :: IRIType
0ec1551231bc5dfdcb3f2bd68fec7457fade7bfdFelix Gabriel Mance , expandedIRI :: String
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance -- ^ the associated namespace uri (not printed)
852bd6145634dc2832b61c44678fe539bc1682d5Christian Maeder , iriPos :: Range
968930c7674ae3b63d308bf4fa651400aa263054Christian Maeder } deriving Show
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Manceinstance Eq QName where
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance p == q = compare p q == EQ
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Manceinstance Ord QName where
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance compare (QN p1 l1 b1 n1 _) (QN p2 l2 b2 n2 _) =
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance if null n1 || null n2 then compare (b1, p1, l1) (b2, p2, l2) else
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance compare n1 n2 -- compare fully expanded names only
68de80eb2800338cbd16512106fcadab79325d8bChristian MaederqNameRange :: QName -> [Pos]
68de80eb2800338cbd16512106fcadab79325d8bChristian MaederqNameRange q = let Range rs = iriPos q in case rs of
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder p0 = if iriType q == Full then incSourceColumn p (-1) else p
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder in tokenRange $ Token (showQN q) $ Range [p0]
fc7bd98aabe1bc26058660085e8c77d60a97bcecChristian Maederinstance GetRange QName where
fc7bd98aabe1bc26058660085e8c77d60a97bcecChristian Maeder getRange = iriPos
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder rangeSpan = qNameRange
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceshowQN :: QName -> String
68de80eb2800338cbd16512106fcadab79325d8bChristian MaedershowQN q = (if iriType q == Full then showQI else showQU) q
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance-- | show QName as abbreviated iri
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceshowQU :: QName -> String
852bd6145634dc2832b61c44678fe539bc1682d5Christian MaedershowQU (QN pre local _ _ _) =
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance if null pre then local else pre ++ ":" ++ local
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance-- | show QName in ankle brackets as full iris
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceshowQI :: QName -> String
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel ManceshowQI = ('<' :) . (++ ">") . showQU
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel MancenullQName :: QName
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel MancenullQName = QN "" "" Abbreviated "" nullRange
544989bc1f6ed4bc0813334ffd934db0fb0010eaFelix Gabriel ManceisNullQName :: QName -> Bool
544989bc1f6ed4bc0813334ffd934db0fb0010eaFelix Gabriel ManceisNullQName qn = case qn of
544989bc1f6ed4bc0813334ffd934db0fb0010eaFelix Gabriel Mance QN "" "" _ "" _ -> True
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel MancedummyQName :: QName
02c522d7af110fcad567e3db59f444185ad2c22eFelix Gabriel Mance QN "http" "//www.dfki.de/sks/hets/ontology/unamed" Full
02c522d7af110fcad567e3db59f444185ad2c22eFelix Gabriel Mance "http://www.dfki.de/sks/hets/ontology/unamed" nullRange
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel MancemkQName :: String -> QName
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel MancemkQName s = nullQName { localPart = s }
852bd6145634dc2832b61c44678fe539bc1682d5Christian MaedersetQRange :: Range -> QName -> QName
852bd6145634dc2832b61c44678fe539bc1682d5Christian MaedersetQRange r q = q { iriPos = r }
ea3f858eb531d981df3ed00beeadd99cf025adecChristian MaedersetPrefix :: String -> QName -> QName
ea3f858eb531d981df3ed00beeadd99cf025adecChristian MaedersetPrefix s q = q { namePrefix = s }
75aaf82c430ad2a5cf159962b1c5c09255010fb4Felix Gabriel MancesetFull :: QName -> QName
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel MancesetFull q = q {iriType = Full}
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancetype IRI = QName
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance-- | checks if an IRI is an anonymous individual
1b1144abf7f95a4b23405b8d5604813cfe7b036aFelix Gabriel ManceisAnonymous :: IRI -> Bool
19e01e1a7e319063434bd86c8ecbc5f241ef9993Felix Gabriel ManceisAnonymous iri = iriType iri == NodeID || namePrefix iri == "_"
5a3ae0a9224276de25e709ef8788c1b9716cd206Christian Maeder-- | checks if a string (bound to be localPart of an IRI) contains \":\/\/\"
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel MancecssIRI :: String -> IRIType
668c9c725a11c0f77057152148570af853a1bc0dFelix Gabriel MancecssIRI iri = if isInfixOf "://" iri then Full else Abbreviated
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance-- | prefix -> localname
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype PrefixMap = Map.Map String String
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel MancepredefPrefixes :: PrefixMap
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel Mance [ ("owl", "http://www.w3.org/2002/07/owl#")
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel Mance , ("rdf", "http://www.w3.org/1999/02/22-rdf-syntax-ns#")
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel Mance , ("rdfs", "http://www.w3.org/2000/01/rdf-schema#")
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel Mance , ("xsd", "http://www.w3.org/2001/XMLSchema#")
1b90322eaf59ded3de24fc891bd67bbd73ec2bfaFelix Gabriel Mance , ("", showQU dummyQName ++ "#") ]
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype LexicalForm = String
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype LanguageTag = String
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype ImportIRI = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype OntologyIRI = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype Class = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype Datatype = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype ObjectProperty = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype DataProperty = IRI
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancetype AnnotationProperty = IRI
9cb6af1a7632f12b60f592ce5eb2ac51e6bd33bbFelix Gabriel Mancetype Individual = IRI
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancedata EquivOrDisjoint = Equivalent | Disjoint
968930c7674ae3b63d308bf4fa651400aa263054Christian Maeder deriving (Show, Eq, Ord)
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowEquivOrDisjoint :: EquivOrDisjoint -> String
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowEquivOrDisjoint ed = case ed of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance Equivalent -> equivalentToC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance Disjoint -> disjointWithC
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancedata DomainOrRange = ADomain | ARange
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowDomainOrRange :: DomainOrRange -> String
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowDomainOrRange dr = case dr of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance ADomain -> domainC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance ARange -> rangeC
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancedata SameOrDifferent = Same | Different
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel ManceshowSameOrDifferent :: SameOrDifferent -> String
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel ManceshowSameOrDifferent sd = case sd of
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance Same -> sameAsC
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance Different -> differentFromC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancedata Relation =
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance EDRelation EquivOrDisjoint
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | SubPropertyOf
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | DRRelation DomainOrRange
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | SDRelation SameOrDifferent
968930c7674ae3b63d308bf4fa651400aa263054Christian Maeder deriving (Show, Eq, Ord)
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowRelation :: Relation -> String
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowRelation r = case r of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance EDRelation ed -> showEquivOrDisjoint ed
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance SubPropertyOf -> subPropertyOfC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance InverseOf -> inverseOfC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance SubClass -> subClassOfC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance Types -> typesC
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance DRRelation dr -> showDomainOrRange dr
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance SDRelation sd -> showSameOrDifferent sd
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel MancegetED :: Relation -> EquivOrDisjoint
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel MancegetED r = case r of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance EDRelation ed -> ed
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance _ -> error "not domain or range"
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel MancegetDR :: Relation -> DomainOrRange
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel MancegetDR r = case r of
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance DRRelation dr -> dr
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance _ -> error "not domain or range"
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel MancegetSD :: Relation -> SameOrDifferent
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel MancegetSD s = case s of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance SDRelation sd -> sd
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance _ -> error "not same or different"
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancedata Character =
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | InverseFunctional
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | Antisymmetric
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance deriving (Enum, Bounded, Show, Eq, Ord)
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancedata PositiveOrNegative = Positive | Negative
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancedata QuantifierType = AllValuesFrom | SomeValuesFrom
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowQuantifierType :: QuantifierType -> String
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel ManceshowQuantifierType ty = case ty of
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance AllValuesFrom -> onlyS
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance SomeValuesFrom -> someS
083b2687afdb676237f926bdb643b24027291d05Felix Gabriel Mance-- * Predefined IRI checkings
511be329b2e8f55d0c6b18bd92571a1776b15932Felix Gabriel ManceisThing :: IRI -> Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisThing = isOWLPredef predefClass
0c3badd7ad83eb89f64ef5ed1122c4fa856fb45dFelix Gabriel ManceisPredefObjProp :: IRI -> Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisPredefObjProp = isOWLPredef predefObjProp
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisPredefDataProp :: IRI -> Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisPredefDataProp = isOWLPredef predefDataProp
d850dba73b02f345f64a3546d0f0299c292f88d6Felix Gabriel ManceisPredefRDFSAnnoProp :: IRI -> Bool
0c3badd7ad83eb89f64ef5ed1122c4fa856fb45dFelix Gabriel ManceisPredefRDFSAnnoProp = checkPredef predefRDFSAnnoProps "rdfs"
d850dba73b02f345f64a3546d0f0299c292f88d6Felix Gabriel ManceisPredefOWLAnnoProp :: IRI -> Bool
0c3badd7ad83eb89f64ef5ed1122c4fa856fb45dFelix Gabriel ManceisPredefOWLAnnoProp = isOWLPredef predefOWLAnnoProps
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisPredefAnnoProp :: IRI -> Bool
d850dba73b02f345f64a3546d0f0299c292f88d6Felix Gabriel ManceisPredefAnnoProp iri = isPredefOWLAnnoProp iri || isPredefRDFSAnnoProp iri
6504b297e21d071d8fada2f732cabb6d8f7d38a2Felix Gabriel ManceisPredefPropOrClass :: IRI -> Bool
6504b297e21d071d8fada2f732cabb6d8f7d38a2Felix Gabriel ManceisPredefPropOrClass iri = isPredefAnnoProp iri || isPredefDataProp iri
6504b297e21d071d8fada2f732cabb6d8f7d38a2Felix Gabriel Mance || isPredefObjProp iri || isThing iri
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancepredefIRIs :: [IRI]
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancepredefIRIs = map (setPrefix "xsd" . mkQName) xsdKeys
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel Mance ++ map (setPrefix "owl" . mkQName) owlNumbers
090c663fcc1593c66f39a0972326799a672760d5Christian Maeder ++ map (setPrefix "rdf" . mkQName) [rdfsLiteral, stringS]
090c663fcc1593c66f39a0972326799a672760d5Christian Maeder ++ [setPrefix "rdfs" $ mkQName xmlLiteral]
44985cbd4eb61dbc348617ebdd44a774e51dac07Christian MaederisDatatypeKey :: IRI -> Bool
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaederisDatatypeKey = not . null . isDatatypeKeyAux
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaederisDatatypeKeyAux :: IRI -> [(String, String)]
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaederisDatatypeKeyAux iri = mapMaybe (\ (l, p) -> checkPredefAux l p iri)
090c663fcc1593c66f39a0972326799a672760d5Christian Maeder [ (xsdKeys, "xsd"), (owlNumbers, "owl"), ([xmlLiteral, stringS], "rdf")
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder , ([rdfsLiteral], "rdfs")]
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaedercheckPredefAux :: [String] -> String -> IRI -> Maybe (String, String)
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaedercheckPredefAux sl pref u =
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder let m1 = if elem (namePrefix u) ["", pref] then
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder lookup (localPart u) $ map (\ a -> (a, (pref, a))) sl
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder in case m1 of
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder Nothing -> lookup (showQU u) $ concatMap (\ a ->
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder [ (Map.findWithDefault "" pref predefPrefixes ++ a, (pref, a))
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder , (showQU dummyQName ++ "#" ++ a, (pref, a))]) sl
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancecheckPredef :: [String] -> String -> IRI -> Bool
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaedercheckPredef sl pref = isJust . checkPredefAux sl pref
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisOWLPredef :: [String] -> IRI -> Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel ManceisOWLPredef sl = checkPredef sl "owl"
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance-- | sets the correct prefix for the predefined datatypes
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancesetDatatypePrefix :: IRI -> IRI
1075744775ba70c9ef6cdd06523204751f544ed5Christian MaedersetDatatypePrefix iri = case isDatatypeKeyAux iri of
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder (p, l) : _ -> setPrefix p $ mkQName l
1075744775ba70c9ef6cdd06523204751f544ed5Christian Maeder _ -> error $ showQU iri ++ " is not a predefined datatype"
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance-- | checks if the IRI is part of the built-in ones and puts the correct prefix
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancesetReservedPrefix :: IRI -> IRI
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancesetReservedPrefix iri
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance | isDatatypeKey iri && null (namePrefix iri) = setDatatypePrefix iri
d850dba73b02f345f64a3546d0f0299c292f88d6Felix Gabriel Mance | (isThing iri || isPredefDataProp iri || isPredefOWLAnnoProp iri
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance || isPredefObjProp iri) && null (namePrefix iri) = setPrefix "owl" iri
d850dba73b02f345f64a3546d0f0299c292f88d6Felix Gabriel Mance | isPredefRDFSAnnoProp iri = setPrefix "rdfs" iri
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance | otherwise = iri
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancestripReservedPrefix :: IRI -> IRI
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancestripReservedPrefix = mkQName . getPredefName
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance{- | returns the name of the predefined IRI (e.g <xsd:string> returns "string"
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance or <http://www.w3.org/2002/07/owl#real> returns "real") -}
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancegetPredefName :: IRI -> String
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancegetPredefName iri =
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance if namePrefix iri `elem` ["", "xsd", "rdf", "rdfs", "owl"]
0c3badd7ad83eb89f64ef5ed1122c4fa856fb45dFelix Gabriel Mance then localPart iri
771c32080c77497c6c023a3b1c422f7daf3773f7Felix Gabriel Mance else case mapMaybe (`stripPrefix` showQU iri)
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance $ Map.elems predefPrefixes of
3980dee81f793b601da33adea1b55753bab868a9Felix Gabriel Mance _ -> showQN iri
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian Maeder-- | Extracts Token from IRI
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian MaederuriToTok :: IRI -> Token
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian MaederuriToTok urI = mkSimpleId $ getPredefName urI
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian Maeder-- | Extracts Id from IRI
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian MaederuriToId :: IRI -> Id
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian MaederuriToId = simpleIdToId . uriToTok
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian Maeder-- | Extracts Id from Entities
92ae4d5885ea837ffe3dae9b2de742f871229b94Christian MaederentityToId :: Entity -> Id
669b3375925f7a145d287fa89f3a815708dbe7a1Christian MaederentityToId = uriToId . cutIRI
a03c109eabfe250e4b57bdf44f37f53751a65df4Felix Gabriel ManceprintDatatype :: IRI -> String
a03c109eabfe250e4b57bdf44f37f53751a65df4Felix Gabriel ManceprintDatatype dt = showQU $
a03c109eabfe250e4b57bdf44f37f53751a65df4Felix Gabriel Mance if isDatatypeKey dt then stripReservedPrefix dt else dt
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mancedata DatatypeCat = OWL2Number | OWL2String | OWL2Bool | Other
83f5f3291f9b40fa688776b4da10b5fa102a5ff8Felix Gabriel Mance deriving (Show, Eq, Ord)
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancegetDatatypeCat :: IRI -> DatatypeCat
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancegetDatatypeCat iri = case isDatatypeKey iri of
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance | hasPrefXSD [booleanS] iri -> OWL2Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance | hasPrefXSD xsdNumbers iri || checkPredef owlNumbers "owl" iri
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance | hasPrefXSD xsdStrings iri -> OWL2String
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance | otherwise -> Other
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance False -> Other
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancehasPrefXSD :: [String] -> IRI -> Bool
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel MancehasPrefXSD sl = checkPredef sl "xsd"
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancefacetToIRI :: DatatypeFacet -> ConstrainingFacet
4b7c9b9fec53befb553f2c9b11e30a4fe2235e03Felix Gabriel MancefacetToIRI = setPrefix "xsd" . mkQName . showFacet
863fa65ac095659c6da1cde7fe7b839f1e7f60f9Felix Gabriel Mance-- * Cardinalities
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mancedata CardinalityType = MinCardinality | MaxCardinality | ExactCardinality
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance deriving (Show, Eq, Ord)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceshowCardinalityType :: CardinalityType -> String
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceshowCardinalityType ty = case ty of
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance MinCardinality -> minS
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance MaxCardinality -> maxS
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance ExactCardinality -> exactlyS
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mancedata Cardinality a b = Cardinality CardinalityType Int a (Maybe b)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance deriving (Show, Eq, Ord)
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mancedata JunctionType = UnionOf | IntersectionOf
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mancetype ConstrainingFacet = IRI
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mancetype RestrictionValue = Literal
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maederdata Entity = Entity
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder { entityKind :: EntityType
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder , cutIRI :: IRI }
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder deriving (Show, Eq, Ord)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Manceinstance GetRange Entity where
669b3375925f7a145d287fa89f3a815708dbe7a1Christian Maeder getRange = iriPos . cutIRI
68de80eb2800338cbd16512106fcadab79325d8bChristian Maeder rangeSpan = qNameRange . cutIRI
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mancedata EntityType =
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | ObjectProperty
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | DataProperty
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | AnnotationProperty
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | NamedIndividual
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance deriving (Enum, Bounded, Show, Read, Eq, Ord)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceshowEntityType :: EntityType -> String
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceshowEntityType e = case e of
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance Datatype -> datatypeC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance Class -> classC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance ObjectProperty -> objectPropertyC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance DataProperty -> dataPropertyC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance AnnotationProperty -> annotationPropertyC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance NamedIndividual -> individualC
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceentityTypes :: [EntityType]
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel ManceentityTypes = [minBound .. maxBound]
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancedata TypedOrUntyped = Typed Datatype | Untyped (Maybe LanguageTag)
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance deriving (Show, Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederdata Literal = Literal LexicalForm TypedOrUntyped | NumberLit FloatLit
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance deriving (Show, Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder-- | non-negative integers given by the sequence of digits
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederdata NNInt = NNInt [Int] deriving (Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederinstance Show NNInt where
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder show (NNInt l) = map intToDigit l
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederzeroNNInt :: NNInt
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederzeroNNInt = NNInt []
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisZeroNNInt :: NNInt -> Bool
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisZeroNNInt (NNInt l) = null l
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederdata IntLit = IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder { absInt :: NNInt
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder , isNegInt :: Bool }
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder deriving (Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederinstance Show IntLit where
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder show (IntLit n b) = (if b then ('-' :) else id) $ show n
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederzeroInt :: IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederzeroInt = IntLit zeroNNInt False
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisZeroInt :: IntLit -> Bool
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisZeroInt (IntLit n _) = isZeroNNInt n
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaedernegNNInt :: Bool -> NNInt -> IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaedernegNNInt b n = IntLit n b
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaedernegInt :: IntLit -> IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaedernegInt (IntLit n b) = IntLit n $ not b
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederdata DecLit = DecLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder { truncDec :: IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder , fracDec :: NNInt }
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder deriving (Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederinstance Show DecLit where
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder show (DecLit t f) = show t
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder ++ if isZeroNNInt f then "" else
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisDecInt :: DecLit -> Bool
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisDecInt = isZeroNNInt . fracDec
cbb0a924599bcaea230e7dcd2892cc91c49319aeChristian MaedernegDec :: Bool -> DecLit -> DecLit
d66846429fcdd6882e62c7e5b911f98b3812ff09Felix Gabriel MancenegDec b (DecLit t f) = DecLit (if b then negInt t else t) f
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederdata FloatLit = FloatLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder { floatBase :: DecLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder , floatExp :: IntLit }
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder deriving (Eq, Ord)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maederinstance Show FloatLit where
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder show (FloatLit b e) = show b
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder ++ if isZeroInt e then "" else
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian Maeder 'E' : show e ++ "F"
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisFloatDec :: FloatLit -> Bool
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisFloatDec = isZeroInt . floatExp
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisFloatInt :: FloatLit -> Bool
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederisFloatInt f = isFloatDec f && isDecInt (floatBase f)
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederfloatToInt :: FloatLit -> IntLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederfloatToInt = truncDec . floatBase
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederintToDec :: IntLit -> DecLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederintToDec i = DecLit i zeroNNInt
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederdecToFloat :: DecLit -> FloatLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederdecToFloat d = FloatLit d zeroInt
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederintToFloat :: IntLit -> FloatLit
b1162cc13e8371724e3382ae6d1cfdeb43891fbbChristian MaederintToFloat = decToFloat . intToDec
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabInt :: IntLit -> IntLit
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabInt int = int {isNegInt = False}
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabDec :: DecLit -> DecLit
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabDec dec = dec {truncDec = abInt $ truncDec dec}
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabFloat :: FloatLit -> FloatLit
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceabFloat f = f {floatBase = abDec $ floatBase f}
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceisNegDec :: DecLit -> Bool
c704da29ad5d9d00c07e75f9109442d178dd990bFelix Gabriel ManceisNegDec d = isNegInt $ truncDec d
a4a1b0cfce938fc38d5924b8fb6a7e140602ec5cFelix Gabriel MancenumberName :: FloatLit -> String
52991d9b46a98ad6a9020421a3244950b0f8a522Felix Gabriel Mance | isFloatInt f = integerS
52991d9b46a98ad6a9020421a3244950b0f8a522Felix Gabriel Mance | isFloatDec f = decimalS
52991d9b46a98ad6a9020421a3244950b0f8a522Felix Gabriel Mance | otherwise = floatS
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel MancecTypeS :: String
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance-- * PROPERTY EXPRESSIONS
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancetype InverseObjectProperty = ObjectPropertyExpression
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancedata ObjectPropertyExpression = ObjectProp ObjectProperty
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance | ObjectInverseOf InverseObjectProperty
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance deriving (Show, Eq, Ord)
707454ba169478cbf17b91b53f8f0aa2ff8a89beChristian MaederobjPropToIRI :: ObjectPropertyExpression -> Individual
707454ba169478cbf17b91b53f8f0aa2ff8a89beChristian MaederobjPropToIRI opExp = case opExp of
707454ba169478cbf17b91b53f8f0aa2ff8a89beChristian Maeder ObjectProp u -> u
707454ba169478cbf17b91b53f8f0aa2ff8a89beChristian Maeder ObjectInverseOf objProp -> objPropToIRI objProp
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mancetype DataPropertyExpression = DataProperty
c77c0efe19dc6556ac872828bfb4cfc5fbca5ac5Felix Gabriel Mance-- * DATA RANGES
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mancedata DataRange =
fa544036407a8ec4be203ebd5e3bff225175e664Felix Gabriel Mance DataType Datatype [(ConstrainingFacet, RestrictionValue)]
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | DataJunction JunctionType [DataRange]
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | DataComplementOf DataRange
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | DataOneOf [Literal]
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance deriving (Show, Eq, Ord)
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance-- * CLASS EXPERSSIONS
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancedata ClassExpression =
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance Expression Class
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | ObjectJunction JunctionType [ClassExpression]
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | ObjectComplementOf ClassExpression
e99c3c1f572d0442872bba58f187ca520ef5d040Felix Gabriel Mance | ObjectOneOf [Individual]
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | ObjectValuesFrom QuantifierType ObjectPropertyExpression ClassExpression
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | ObjectHasValue ObjectPropertyExpression Individual
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | ObjectHasSelf ObjectPropertyExpression
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | ObjectCardinality (Cardinality ObjectPropertyExpression ClassExpression)
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance | DataValuesFrom QuantifierType DataPropertyExpression DataRange
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mance | DataHasValue DataPropertyExpression Literal
c298a419605037f5352b5ad0f67b3e06db094051Felix Gabriel Mance | DataCardinality (Cardinality DataPropertyExpression DataRange)
968930c7674ae3b63d308bf4fa651400aa263054Christian Maeder deriving (Show, Eq, Ord)
1435782fda52a2898ea74e99088351d4f5b450dcChristian Maeder-- * ANNOTATIONS
8af00c8930672188ae80c8829428859160d329d0Felix Gabriel Mancedata Annotation = Annotation [Annotation] AnnotationProperty AnnotationValue
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)
771c32080c77497c6c023a3b1c422f7daf3773f7Felix Gabriel Mancedata AnnotationValue = AnnValue IRI | AnnValLit Literal
ffa6044b04fa0e31242141ff56a5d80c4233b676Felix Gabriel Mance deriving (Show, Eq, Ord)