packages feed

chiasma-0.2.0.0: lib/Chiasma/Data/Ident.hs

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 (Eq, Generic, Data, NFData, Ord)

instance Show Ident where
  show = toString . identText

class Identifiable a where
  identify :: a -> Ident

instance Identifiable Ident where
  identify = id

instance Pretty Ident where
  pretty (Str s) = pretty s
  pretty (Uuid u) = pretty . UUID.toText $ u

instance Default Ident where
  def = Str ""

instance IsString Ident where
  fromString = Str . toText

instance FromJSON Ident where

instance ToJSON Ident where
  toEncoding = genericToEncoding defaultOptions

sameIdent ::
  Identifiable a =>
  Identifiable b =>
  a ->
  b ->
  Bool
sameIdent target b =
  identify target == identify b

identText :: Ident -> Text
identText (Str a) = a
identText (Uuid a) = UUID.toText a

generateIdent :: MonadIO m => m Ident
generateIdent = liftIO $ Uuid <$> randomIO

parseIdent :: Text -> Ident
parseIdent text =
  maybe (Str text) Uuid (UUID.fromText text)