module Signet.Unstable.Type.Id where

import qualified Control.Monad as Monad
import qualified Data.ByteString as ByteString
import qualified Data.Word as Word
import qualified Signet.Unstable.Exception.InvalidId as InvalidId

newtype Id
  = MkId ByteString.ByteString
  deriving (Id -> Id -> Bool
(Id -> Id -> Bool) -> (Id -> Id -> Bool) -> Eq Id
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Id -> Id -> Bool
== :: Id -> Id -> Bool
$c/= :: Id -> Id -> Bool
/= :: Id -> Id -> Bool
Eq, Int -> Id -> ShowS
[Id] -> ShowS
Id -> String
(Int -> Id -> ShowS)
-> (Id -> String) -> ([Id] -> ShowS) -> Show Id
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Id -> ShowS
showsPrec :: Int -> Id -> ShowS
$cshow :: Id -> String
show :: Id -> String
$cshowList :: [Id] -> ShowS
showList :: [Id] -> ShowS
Show)

unwrap :: Id -> ByteString.ByteString
unwrap :: Id -> ByteString
unwrap (MkId ByteString
byteString) = ByteString
byteString

separator :: Word.Word8
separator :: Word8
separator = Word8
0x2e

parse :: ByteString.ByteString -> Either InvalidId.InvalidId Id
parse :: ByteString -> Either InvalidId Id
parse ByteString
byteString = do
  Bool -> Either InvalidId () -> Either InvalidId ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
Monad.when ((Word8 -> Bool) -> ByteString -> Bool
ByteString.any (Word8 -> Word8 -> Bool
forall a. Eq a => a -> a -> Bool
== Word8
separator) ByteString
byteString)
    (Either InvalidId () -> Either InvalidId ())
-> (InvalidId -> Either InvalidId ())
-> InvalidId
-> Either InvalidId ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InvalidId -> Either InvalidId ()
forall a b. a -> Either a b
Left
    (InvalidId -> Either InvalidId ())
-> InvalidId -> Either InvalidId ()
forall a b. (a -> b) -> a -> b
$ ByteString -> InvalidId
InvalidId.MkInvalidId ByteString
byteString
  Id -> Either InvalidId Id
forall a b. b -> Either a b
Right (Id -> Either InvalidId Id) -> Id -> Either InvalidId Id
forall a b. (a -> b) -> a -> b
$ ByteString -> Id
MkId ByteString
byteString

render :: Id -> ByteString.ByteString
render :: Id -> ByteString
render = Id -> ByteString
unwrap