module HaskellWorks.Polysemy.Data.ULID
  ( getULIDTime,
    getULID,
    ulidToInteger,
    ulidFromInteger,
  ) where

import           Control.Monad.IO.Class (MonadIO (..))
import           Data.Time.Clock.POSIX
import qualified Data.ULID              as ULID
import           HaskellWorks.Prelude
import           Polysemy

getULIDTime :: forall r m. ()
  => MonadIO m
  => Member (Embed m) r
  => POSIXTime
  -> Sem r ULID.ULID
getULIDTime :: forall (r :: EffectRow) (m :: * -> *).
(MonadIO m, Member (Embed m) r) =>
POSIXTime -> Sem r ULID
getULIDTime POSIXTime
time =
  m ULID -> Sem r ULID
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (m ULID -> Sem r ULID) -> m ULID -> Sem r ULID
forall a b. (a -> b) -> a -> b
$ IO ULID -> m ULID
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ULID -> m ULID) -> IO ULID -> m ULID
forall a b. (a -> b) -> a -> b
$ POSIXTime -> IO ULID
ULID.getULIDTime POSIXTime
time

getULID :: forall r m. ()
  => MonadIO m
  => Member (Embed m) r
  => Sem r ULID.ULID
getULID :: forall (r :: EffectRow) (m :: * -> *).
(MonadIO m, Member (Embed m) r) =>
Sem r ULID
getULID =
  m ULID -> Sem r ULID
forall (m :: * -> *) (r :: EffectRow) a.
Member (Embed m) r =>
m a -> Sem r a
embed (m ULID -> Sem r ULID) -> m ULID -> Sem r ULID
forall a b. (a -> b) -> a -> b
$ IO ULID -> m ULID
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO ULID
ULID.getULID

ulidToInteger :: ULID.ULID -> Integer
ulidToInteger :: ULID -> Integer
ulidToInteger =
  ULID -> Integer
ULID.ulidToInteger

ulidFromInteger :: Integer -> Either Text ULID.ULID
ulidFromInteger :: Integer -> Either Text ULID
ulidFromInteger =
  Integer -> Either Text ULID
ULID.ulidFromInteger