module Network.GRPC.Common.Compression (
Compression(..)
, CompressionId(..)
, gzip
, allSupportedCompression
, Negotation(..)
, getSupported
, none
, chooseFirst
, only
, insist
) where
import Data.Default
import Data.Foldable (toList)
import Data.List.NonEmpty (NonEmpty(..))
import Data.List.NonEmpty qualified as NE
import Data.Map (Map)
import Data.Map qualified as Map
import Network.GRPC.Spec
data Negotation = Negotation {
Negotation -> NonEmpty CompressionId
offer :: NonEmpty CompressionId
, Negotation -> NonEmpty CompressionId -> Compression
choose :: NonEmpty CompressionId -> Compression
, Negotation -> Map CompressionId Compression
supported :: Map CompressionId Compression
}
getSupported :: Negotation -> CompressionId -> Maybe Compression
getSupported :: Negotation -> CompressionId -> Maybe Compression
getSupported Negotation
compr CompressionId
cid = CompressionId -> Map CompressionId Compression -> Maybe Compression
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup CompressionId
cid (Negotation -> Map CompressionId Compression
supported Negotation
compr)
instance Default Negotation where
def :: Negotation
def = NonEmpty Compression -> Negotation
chooseFirst NonEmpty Compression
allSupportedCompression
none :: Negotation
none :: Negotation
none = Compression -> Negotation
insist Compression
noCompression
chooseFirst :: NonEmpty Compression -> Negotation
chooseFirst :: NonEmpty Compression -> Negotation
chooseFirst NonEmpty Compression
ourSupported = Negotation {
offer :: NonEmpty CompressionId
offer =
(Compression -> CompressionId)
-> NonEmpty Compression -> NonEmpty CompressionId
forall a b. (a -> b) -> NonEmpty a -> NonEmpty b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Compression -> CompressionId
compressionId NonEmpty Compression
ourSupported
, choose :: NonEmpty CompressionId -> Compression
choose = \NonEmpty CompressionId
peerSupported ->
let peerSupports :: Compression -> Bool
peerSupports :: Compression -> Bool
peerSupports = (CompressionId -> NonEmpty CompressionId -> Bool
forall a. Eq a => a -> NonEmpty a -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` NonEmpty CompressionId
peerSupported) (CompressionId -> Bool)
-> (Compression -> CompressionId) -> Compression -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Compression -> CompressionId
compressionId
in case (Compression -> Bool) -> NonEmpty Compression -> [Compression]
forall a. (a -> Bool) -> NonEmpty a -> [a]
NE.filter Compression -> Bool
peerSupports NonEmpty Compression
ourSupported of
Compression
c:[Compression]
_ -> Compression
c
[] -> Compression
noCompression
, supported :: Map CompressionId Compression
supported =
[(CompressionId, Compression)] -> Map CompressionId Compression
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(CompressionId, Compression)] -> Map CompressionId Compression)
-> [(CompressionId, Compression)] -> Map CompressionId Compression
forall a b. (a -> b) -> a -> b
$
(Compression -> (CompressionId, Compression))
-> [Compression] -> [(CompressionId, Compression)]
forall a b. (a -> b) -> [a] -> [b]
map (\Compression
c -> (Compression -> CompressionId
compressionId Compression
c, Compression
c)) (NonEmpty Compression -> [Compression]
forall a. NonEmpty a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList NonEmpty Compression
ourSupported)
}
only :: Compression -> Negotation
only :: Compression -> Negotation
only Compression
compr = NonEmpty Compression -> Negotation
chooseFirst (Compression
compr Compression -> [Compression] -> NonEmpty Compression
forall a. a -> [a] -> NonEmpty a
:| [Compression
noCompression])
insist :: Compression -> Negotation
insist :: Compression -> Negotation
insist Compression
compr = Negotation {
offer :: NonEmpty CompressionId
offer = Compression -> CompressionId
compressionId Compression
compr CompressionId -> [CompressionId] -> NonEmpty CompressionId
forall a. a -> [a] -> NonEmpty a
:| []
, choose :: NonEmpty CompressionId -> Compression
choose = \NonEmpty CompressionId
_ -> Compression
compr
, supported :: Map CompressionId Compression
supported = CompressionId -> Compression -> Map CompressionId Compression
forall k a. k -> a -> Map k a
Map.singleton (Compression -> CompressionId
compressionId Compression
compr) Compression
compr
}