module Net.DNSBase.RData.SVCB.SPVSet
( SPVSet(SPVMap)
, spvLookup
, spvSetFromMonoList
) where
import qualified Data.IntMap.Strict as IM
import GHC.IsList(IsList(..))
import Net.DNSBase.Internal.Util
import Net.DNSBase.Present
import Net.DNSBase.RData.SVCB.SVCParamValue
newtype SPVSet = SPVSet (IM.IntMap SVCParamValue)
deriving (SPVSet -> SPVSet -> Bool
(SPVSet -> SPVSet -> Bool)
-> (SPVSet -> SPVSet -> Bool) -> Eq SPVSet
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SPVSet -> SPVSet -> Bool
== :: SPVSet -> SPVSet -> Bool
$c/= :: SPVSet -> SPVSet -> Bool
/= :: SPVSet -> SPVSet -> Bool
Eq, NonEmpty SPVSet -> SPVSet
SPVSet -> SPVSet -> SPVSet
(SPVSet -> SPVSet -> SPVSet)
-> (NonEmpty SPVSet -> SPVSet)
-> (forall b. Integral b => b -> SPVSet -> SPVSet)
-> Semigroup SPVSet
forall b. Integral b => b -> SPVSet -> SPVSet
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
$c<> :: SPVSet -> SPVSet -> SPVSet
<> :: SPVSet -> SPVSet -> SPVSet
$csconcat :: NonEmpty SPVSet -> SPVSet
sconcat :: NonEmpty SPVSet -> SPVSet
$cstimes :: forall b. Integral b => b -> SPVSet -> SPVSet
stimes :: forall b. Integral b => b -> SPVSet -> SPVSet
Semigroup, Semigroup SPVSet
SPVSet
Semigroup SPVSet =>
SPVSet
-> (SPVSet -> SPVSet -> SPVSet)
-> ([SPVSet] -> SPVSet)
-> Monoid SPVSet
[SPVSet] -> SPVSet
SPVSet -> SPVSet -> SPVSet
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
$cmempty :: SPVSet
mempty :: SPVSet
$cmappend :: SPVSet -> SPVSet -> SPVSet
mappend :: SPVSet -> SPVSet -> SPVSet
$cmconcat :: [SPVSet] -> SPVSet
mconcat :: [SPVSet] -> SPVSet
Monoid)
instance Show SPVSet where
showsPrec :: Key -> SPVSet -> ShowS
showsPrec Key
p (SPVSet -> [Item SPVSet]
forall l. IsList l => l -> [Item l]
toList -> [Item SPVSet]
pvs) = Key -> ShowS -> ShowS
showsP Key
p (ShowS -> ShowS) -> ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$
String -> ShowS
showString String
"fromList @SPVSet " ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [SVCParamValue] -> ShowS
forall a. Show a => a -> ShowS
shows' [Item SPVSet]
[SVCParamValue]
pvs
instance Presentable SPVSet where
present :: SPVSet -> Builder -> Builder
present SPVSet
vs Builder
k = case SPVSet -> [Item SPVSet]
forall l. IsList l => l -> [Item l]
toList SPVSet
vs of
Item SPVSet
v:[Item SPVSet]
rest -> SVCParamValue -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present Item SPVSet
SVCParamValue
v (Builder -> Builder) -> Builder -> Builder
forall a b. (a -> b) -> a -> b
$ (SVCParamValue -> Builder -> Builder)
-> Builder -> [SVCParamValue] -> Builder
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr SVCParamValue -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
presentSp Builder
k [Item SPVSet]
[SVCParamValue]
rest
[] -> Builder
k
pattern SPVMap :: IM.IntMap SVCParamValue
-> SPVSet
pattern $mSPVMap :: forall {r}.
SPVSet -> (IntMap SVCParamValue -> r) -> ((# #) -> r) -> r
SPVMap m <- SPVSet m
spvLookup :: forall a. KnownSVCParamValue a
=> SPVSet -> Maybe a
spvLookup :: forall a. KnownSVCParamValue a => SPVSet -> Maybe a
spvLookup = (Maybe SVCParamValue -> (SVCParamValue -> Maybe a) -> Maybe a
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. KnownSVCParamValue a => SVCParamValue -> Maybe a
fromSPV @a) (Maybe SVCParamValue -> Maybe a)
-> (SPVSet -> Maybe SVCParamValue) -> SPVSet -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Key -> IntMap SVCParamValue -> Maybe SVCParamValue
forall a. Key -> IntMap a -> Maybe a
IM.lookup Key
key (IntMap SVCParamValue -> Maybe SVCParamValue)
-> (SPVSet -> IntMap SVCParamValue)
-> SPVSet
-> Maybe SVCParamValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SPVSet -> IntMap SVCParamValue
forall a b. Coercible a b => a -> b
coerce
where
key :: Key
key = SVCParamKey -> Key
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SVCParamKey -> Key) -> SVCParamKey -> Key
forall a b. (a -> b) -> a -> b
$ spvKey a
instance IsList SPVSet where
type Item SPVSet = SVCParamValue
fromList :: [Item SPVSet] -> SPVSet
fromList [Item SPVSet]
vs =
IntMap SVCParamValue -> SPVSet
forall a b. Coercible a b => a -> b
coerce (IntMap SVCParamValue -> SPVSet) -> IntMap SVCParamValue -> SPVSet
forall a b. (a -> b) -> a -> b
$ [(Key, SVCParamValue)] -> IntMap SVCParamValue
forall a. [(Key, a)] -> IntMap a
IM.fromList
[ (Key
key, SVCParamValue
v) | SVCParamValue
v <- [Item SPVSet]
[SVCParamValue]
vs , let key :: Key
key = SVCParamKey -> Key
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SVCParamKey -> Key) -> SVCParamKey -> Key
forall a b. (a -> b) -> a -> b
$ SVCParamValue -> SVCParamKey
serviceParamKey SVCParamValue
v ]
toList :: SPVSet -> [Item SPVSet]
toList = IntMap SVCParamValue -> [SVCParamValue]
forall a. IntMap a -> [a]
IM.elems (IntMap SVCParamValue -> [SVCParamValue])
-> (SPVSet -> IntMap SVCParamValue) -> SPVSet -> [SVCParamValue]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SPVSet -> IntMap SVCParamValue
forall a b. Coercible a b => a -> b
coerce
spvSetFromMonoList :: [SVCParamValue] -> SPVSet
spvSetFromMonoList :: [SVCParamValue] -> SPVSet
spvSetFromMonoList = ([SVCParamValue] -> IntMap SVCParamValue)
-> [SVCParamValue] -> SPVSet
forall a b. Coercible a b => a -> b
coerce (([SVCParamValue] -> IntMap SVCParamValue)
-> [SVCParamValue] -> SPVSet)
-> ([SVCParamValue] -> IntMap SVCParamValue)
-> [SVCParamValue]
-> SPVSet
forall a b. (a -> b) -> a -> b
$ [(Key, SVCParamValue)] -> IntMap SVCParamValue
forall a. [(Key, a)] -> IntMap a
IM.fromDistinctAscList ([(Key, SVCParamValue)] -> IntMap SVCParamValue)
-> ([SVCParamValue] -> [(Key, SVCParamValue)])
-> [SVCParamValue]
-> IntMap SVCParamValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (SVCParamValue -> (Key, SVCParamValue))
-> [SVCParamValue] -> [(Key, SVCParamValue)]
forall a b. (a -> b) -> [a] -> [b]
map SVCParamValue -> (Key, SVCParamValue)
forall {a}. Num a => SVCParamValue -> (a, SVCParamValue)
kv
where
kv :: SVCParamValue -> (a, SVCParamValue)
kv !SVCParamValue
v = let !k :: a
k = SVCParamKey -> a
forall a b. (Integral a, Num b) => a -> b
fromIntegral (SVCParamKey -> a) -> SVCParamKey -> a
forall a b. (a -> b) -> a -> b
$ SVCParamValue -> SVCParamKey
serviceParamKey SVCParamValue
v in (a
k, SVCParamValue
v)