module Chiasma.Data.Ident where import Data.Aeson (FromJSON, ToJSON(toEncoding), defaultOptions, genericToEncoding) import Data.Data (Data) import Data.Text.Prettyprint.Doc (Pretty(..)) import Data.UUID (UUID) import qualified Data.UUID as UUID (fromText, toText) import System.Random (randomIO) import qualified Text.Show as Show data Ident = Str Text | Uuid UUID deriving (Ident -> Ident -> Bool (Ident -> Ident -> Bool) -> (Ident -> Ident -> Bool) -> Eq Ident forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Ident -> Ident -> Bool $c/= :: Ident -> Ident -> Bool == :: Ident -> Ident -> Bool $c== :: Ident -> Ident -> Bool Eq, (forall x. Ident -> Rep Ident x) -> (forall x. Rep Ident x -> Ident) -> Generic Ident forall x. Rep Ident x -> Ident forall x. Ident -> Rep Ident x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a $cto :: forall x. Rep Ident x -> Ident $cfrom :: forall x. Ident -> Rep Ident x Generic, Typeable Ident DataType Constr Typeable Ident -> (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Ident -> c Ident) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Ident) -> (Ident -> Constr) -> (Ident -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Ident)) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Ident)) -> ((forall b. Data b => b -> b) -> Ident -> Ident) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r) -> (forall u. (forall d. Data d => d -> u) -> Ident -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> Ident -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Ident -> m Ident) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Ident -> m Ident) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Ident -> m Ident) -> Data Ident Ident -> DataType Ident -> Constr (forall b. Data b => b -> b) -> Ident -> Ident (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Ident -> c Ident (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Ident forall a. Typeable a -> (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> a -> c a) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c a) -> (a -> Constr) -> (a -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c a)) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)) -> ((forall b. Data b => b -> b) -> a -> a) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall u. (forall d. Data d => d -> u) -> a -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> Data a forall u. Int -> (forall d. Data d => d -> u) -> Ident -> u forall u. (forall d. Data d => d -> u) -> Ident -> [u] forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Ident -> m Ident forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Ident -> m Ident forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Ident forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Ident -> c Ident forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Ident) forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Ident) $cUuid :: Constr $cStr :: Constr $tIdent :: DataType gmapMo :: (forall d. Data d => d -> m d) -> Ident -> m Ident $cgmapMo :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Ident -> m Ident gmapMp :: (forall d. Data d => d -> m d) -> Ident -> m Ident $cgmapMp :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Ident -> m Ident gmapM :: (forall d. Data d => d -> m d) -> Ident -> m Ident $cgmapM :: forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Ident -> m Ident gmapQi :: Int -> (forall d. Data d => d -> u) -> Ident -> u $cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Ident -> u gmapQ :: (forall d. Data d => d -> u) -> Ident -> [u] $cgmapQ :: forall u. (forall d. Data d => d -> u) -> Ident -> [u] gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r $cgmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r $cgmapQl :: forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Ident -> r gmapT :: (forall b. Data b => b -> b) -> Ident -> Ident $cgmapT :: (forall b. Data b => b -> b) -> Ident -> Ident dataCast2 :: (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Ident) $cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Ident) dataCast1 :: (forall d. Data d => c (t d)) -> Maybe (c Ident) $cdataCast1 :: forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Ident) dataTypeOf :: Ident -> DataType $cdataTypeOf :: Ident -> DataType toConstr :: Ident -> Constr $ctoConstr :: Ident -> Constr gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Ident $cgunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Ident gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Ident -> c Ident $cgfoldl :: forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Ident -> c Ident $cp1Data :: Typeable Ident Data, Ident -> () (Ident -> ()) -> NFData Ident forall a. (a -> ()) -> NFData a rnf :: Ident -> () $crnf :: Ident -> () NFData, Eq Ident Eq Ident -> (Ident -> Ident -> Ordering) -> (Ident -> Ident -> Bool) -> (Ident -> Ident -> Bool) -> (Ident -> Ident -> Bool) -> (Ident -> Ident -> Bool) -> (Ident -> Ident -> Ident) -> (Ident -> Ident -> Ident) -> Ord Ident Ident -> Ident -> Bool Ident -> Ident -> Ordering Ident -> Ident -> Ident forall a. Eq a -> (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a min :: Ident -> Ident -> Ident $cmin :: Ident -> Ident -> Ident max :: Ident -> Ident -> Ident $cmax :: Ident -> Ident -> Ident >= :: Ident -> Ident -> Bool $c>= :: Ident -> Ident -> Bool > :: Ident -> Ident -> Bool $c> :: Ident -> Ident -> Bool <= :: Ident -> Ident -> Bool $c<= :: Ident -> Ident -> Bool < :: Ident -> Ident -> Bool $c< :: Ident -> Ident -> Bool compare :: Ident -> Ident -> Ordering $ccompare :: Ident -> Ident -> Ordering $cp1Ord :: Eq Ident Ord) instance Show Ident where show :: Ident -> String show = Text -> String forall a. ToString a => a -> String toString (Text -> String) -> (Ident -> Text) -> Ident -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . Ident -> Text identText class Identifiable a where identify :: a -> Ident instance Identifiable Ident where identify :: Ident -> Ident identify = Ident -> Ident forall a. a -> a id instance Pretty Ident where pretty :: Ident -> Doc ann pretty (Str Text s) = Text -> Doc ann forall a ann. Pretty a => a -> Doc ann pretty Text s pretty (Uuid UUID u) = Text -> Doc ann forall a ann. Pretty a => a -> Doc ann pretty (Text -> Doc ann) -> (UUID -> Text) -> UUID -> Doc ann forall b c a. (b -> c) -> (a -> b) -> a -> c . UUID -> Text UUID.toText (UUID -> Doc ann) -> UUID -> Doc ann forall a b. (a -> b) -> a -> b $ UUID u instance Default Ident where def :: Ident def = Text -> Ident Str Text "" instance IsString Ident where fromString :: String -> Ident fromString = Text -> Ident Str (Text -> Ident) -> (String -> Text) -> String -> Ident forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> Text forall a. ToText a => a -> Text toText instance FromJSON Ident where instance ToJSON Ident where toEncoding :: Ident -> Encoding toEncoding = Options -> Ident -> Encoding forall a. (Generic a, GToJSON' Encoding Zero (Rep a)) => Options -> a -> Encoding genericToEncoding Options defaultOptions sameIdent :: Identifiable a => Identifiable b => a -> b -> Bool sameIdent :: a -> b -> Bool sameIdent a target b b = a -> Ident forall a. Identifiable a => a -> Ident identify a target Ident -> Ident -> Bool forall a. Eq a => a -> a -> Bool == b -> Ident forall a. Identifiable a => a -> Ident identify b b identText :: Ident -> Text identText :: Ident -> Text identText (Str Text a) = Text a identText (Uuid UUID a) = UUID -> Text UUID.toText UUID a generateIdent :: MonadIO m => m Ident generateIdent :: m Ident generateIdent = IO Ident -> m Ident forall (m :: * -> *) a. MonadIO m => IO a -> m a liftIO (IO Ident -> m Ident) -> IO Ident -> m Ident forall a b. (a -> b) -> a -> b $ UUID -> Ident Uuid (UUID -> Ident) -> IO UUID -> IO Ident forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> IO UUID forall a. Random a => IO a randomIO parseIdent :: Text -> Ident parseIdent :: Text -> Ident parseIdent Text text = Ident -> (UUID -> Ident) -> Maybe UUID -> Ident forall b a. b -> (a -> b) -> Maybe a -> b maybe (Text -> Ident Str Text text) UUID -> Ident Uuid (Text -> Maybe UUID UUID.fromText Text text)