module Data.JLD.Model.IRI ( CompactIRI (..), compactIriPrefix, compactIriSuffix, isBlankIri, endsWithGenericDelim, parseCompactIri, renderCompactIri, ) where import Data.JLD.Prelude import Data.Char (isAlphaNum) import Data.Text qualified as T (drop, findIndex, isPrefixOf, take, uncons, unsnoc) data CompactIRI = CompactIRI Text Text | BlankIRI Text deriving (Show, Eq) compactIriPrefix :: CompactIRI -> Text compactIriPrefix (CompactIRI prefix _) = prefix compactIriPrefix (BlankIRI _) = "_" compactIriSuffix :: CompactIRI -> Text compactIriSuffix (CompactIRI _ suffix) = suffix compactIriSuffix (BlankIRI suffix) = suffix renderCompactIri :: CompactIRI -> Text renderCompactIri iri = compactIriPrefix iri <> ":" <> compactIriSuffix iri parseCompactIri :: Text -> Maybe CompactIRI parseCompactIri value | Just idx <- (+ 1) <$> T.findIndex (== ':') (T.drop 1 value) , prefix <- T.take idx value , suffix <- T.drop (idx + 1) value , not ("/" `T.isPrefixOf` suffix) , Just (prefixFirst, _) <- T.uncons prefix , prefixFirst == '_' || isAlphaNum prefixFirst = Just <| if prefix == "_" then BlankIRI suffix else CompactIRI prefix suffix | otherwise = Nothing isBlankIri :: Text -> Bool isBlankIri = T.isPrefixOf "_:" endsWithGenericDelim :: Text -> Bool endsWithGenericDelim (T.unsnoc -> Just (_, c)) = c `elem` (":/?#[]@" :: String) endsWithGenericDelim _ = False