packages feed

sqel-0.0.1.0: lib/Sqel/Data/Uid.hs

module Sqel.Data.Uid where

import qualified Data.Aeson as Aeson
import Data.Aeson (FromJSON (..), ToJSON (..), genericParseJSON, object, withObject, (.:), (.=))
import qualified Data.UUID as UUID
import Data.UUID (UUID)

data Uid i a =
  Uid {
    id :: i,
    payload :: a
  }
  deriving stock (Eq, Show, Generic, Functor)

instance (FromJSON a, FromJSON i) => FromJSON (Uid i a) where
  parseJSON v =
    withObject "Uid" parseFlat v <|> genericParseJSON Aeson.defaultOptions v
    where
      parseFlat o =
        Uid <$> o .: "id" <*> parseJSON v

instance (ToJSON a, ToJSON i) => ToJSON (Uid i a) where
  toJSON (Uid id' a) =
    object ["id" .= toJSON id', "payload" .= a]

type Uuid =
  Uid UUID

intUUID :: Int -> UUID
intUUID int =
  UUID.fromWords i' i' i' i'
  where
    i' =
      fromIntegral int

intUuid :: Int -> a -> Uuid a
intUuid i' =
  Uid (intUUID i')