module Data.Library.UUIRI
( UUIRI (..)
, iri
, uuid
, toUUIRI
, fromUUIRI
, isRelative
, isAbsolute
, extension
, domain
, protocol
, dirs
)
where
import Data.Text (Text)
import Data.Library.IRI (IRI, fromIRI)
import qualified Data.Library.IRI as IRI
import Data.Aeson (ToJSON(toJSON), FromJSON(parseJSON), object, (.=), (.:), Value(Object))
import Control.Applicative ((<$>), (<*>))
import Control.Monad (mzero)
import Data.SafeCopy (deriveSafeCopy, base)
import Data.Indexation.UUID (UUID)
newtype UUIRI = UUIRI (UUID, IRI)
instance Eq UUIRI where
uuiri1 == uuiri2 = uuid uuiri1 == uuid uuiri2
instance ToJSON UUIRI where
toJSON (UUIRI (u,i)) = object [ "uuid" .= u, "iri" .= fromIRI i ]
instance FromJSON UUIRI where
parseJSON (Object v) = toUUIRI <$> v .: "uuid" <*> v .: "iri"
parseJSON _ = mzero
iri :: UUIRI -> IRI
iri (UUIRI tuple) = snd tuple
uuid :: UUIRI -> UUID
uuid (UUIRI tuple) = fst tuple
toUUIRI :: UUID -> Text -> UUIRI
toUUIRI u t = UUIRI (u, IRI.toIRI t)
fromUUIRI :: UUIRI -> (UUID, Text)
fromUUIRI (UUIRI (u,iri')) = (u, IRI.fromIRI iri')
isRelative :: UUIRI -> Bool
isRelative = IRI.isRelative . iri
isAbsolute :: UUIRI -> Bool
isAbsolute = IRI.isAbsolute . iri
extension :: UUIRI -> Maybe Text
extension = IRI.extension . iri
domain :: UUIRI -> Maybe Text
domain = IRI.domain . iri
protocol :: UUIRI -> Maybe Text
protocol = IRI.protocol . iri
dirs :: UUIRI -> [Text]
dirs = IRI.dirs . iri
$(deriveSafeCopy 0 'base ''UUIRI)