module Signet.Unstable.Type.Signatures where

import qualified Data.ByteString as ByteString
import qualified Data.Either as Either
import qualified Data.Word as Word
import qualified Signet.Unstable.Exception.InvalidSignature as InvalidSignature
import qualified Signet.Unstable.Exception.UnknownSignature as UnknownSignature
import qualified Signet.Unstable.Type.Signature as Signature

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

unwrap :: Signatures -> [Signature.Signature]
unwrap :: Signatures -> [Signature]
unwrap (MkSignatures [Signature]
signatures) = [Signature]
signatures

separator :: Word.Word8
separator :: Word8
separator = Word8
0x20

parse :: ByteString.ByteString -> Either InvalidSignature.InvalidSignature ([UnknownSignature.UnknownSignature], Signatures)
parse :: ByteString
-> Either InvalidSignature ([UnknownSignature], Signatures)
parse =
  ([Either UnknownSignature Signature]
 -> ([UnknownSignature], Signatures))
-> Either InvalidSignature [Either UnknownSignature Signature]
-> Either InvalidSignature ([UnknownSignature], Signatures)
forall a b.
(a -> b) -> Either InvalidSignature a -> Either InvalidSignature b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (([Signature] -> Signatures)
-> ([UnknownSignature], [Signature])
-> ([UnknownSignature], Signatures)
forall a b.
(a -> b) -> ([UnknownSignature], a) -> ([UnknownSignature], b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Signature] -> Signatures
MkSignatures (([UnknownSignature], [Signature])
 -> ([UnknownSignature], Signatures))
-> ([Either UnknownSignature Signature]
    -> ([UnknownSignature], [Signature]))
-> [Either UnknownSignature Signature]
-> ([UnknownSignature], Signatures)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Either UnknownSignature Signature]
-> ([UnknownSignature], [Signature])
forall a b. [Either a b] -> ([a], [b])
Either.partitionEithers)
    (Either InvalidSignature [Either UnknownSignature Signature]
 -> Either InvalidSignature ([UnknownSignature], Signatures))
-> (ByteString
    -> Either InvalidSignature [Either UnknownSignature Signature])
-> ByteString
-> Either InvalidSignature ([UnknownSignature], Signatures)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString
 -> Either InvalidSignature (Either UnknownSignature Signature))
-> [ByteString]
-> Either InvalidSignature [Either UnknownSignature Signature]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ByteString
-> Either InvalidSignature (Either UnknownSignature Signature)
Signature.parse
    ([ByteString]
 -> Either InvalidSignature [Either UnknownSignature Signature])
-> (ByteString -> [ByteString])
-> ByteString
-> Either InvalidSignature [Either UnknownSignature Signature]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word8 -> ByteString -> [ByteString]
ByteString.split Word8
separator

render :: Signatures -> ByteString.ByteString
render :: Signatures -> ByteString
render =
  ByteString -> [ByteString] -> ByteString
ByteString.intercalate (Word8 -> ByteString
ByteString.singleton Word8
separator)
    ([ByteString] -> ByteString)
-> (Signatures -> [ByteString]) -> Signatures -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Signature -> ByteString) -> [Signature] -> [ByteString]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Signature -> ByteString
Signature.render
    ([Signature] -> [ByteString])
-> (Signatures -> [Signature]) -> Signatures -> [ByteString]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Signatures -> [Signature]
unwrap