module Network.PublicSuffixList.Serialize (getDataStructure, putDataStructure) where

import qualified Data.ByteString      as BS
import qualified Data.ByteString.UTF8 as U8
import           Data.Functor
import           Data.Serialize.Get hiding (getTreeOf)
import           Data.Serialize.Put
import qualified Data.Text            as T

import Network.PublicSuffixList.Types

getTreeOf :: Ord k => Get k -> Get (Tree k)
getTreeOf :: forall k. Ord k => Get k -> Get (Tree k)
getTreeOf Get k
p = forall e. Map e (Tree e) -> Tree e
Node forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall k a. Ord k => Get k -> Get a -> Get (Map k a)
getMapOf Get k
p (forall k. Ord k => Get k -> Get (Tree k)
getTreeOf Get k
p)

getText :: Get T.Text
getText :: Get Text
getText = (String -> Text
T.pack forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> String
U8.toString forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word8] -> ByteString
BS.pack) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Get a -> Get [a]
getListOf Get Word8
getWord8

getDataStructure :: Get DataStructure
getDataStructure :: Get DataStructure
getDataStructure = forall a b. Get a -> Get b -> Get (a, b)
getTwoOf (forall k. Ord k => Get k -> Get (Tree k)
getTreeOf Get Text
getText) (forall k. Ord k => Get k -> Get (Tree k)
getTreeOf Get Text
getText)

putTree :: Ord k => Putter k -> Putter (Tree k)
putTree :: forall k. Ord k => Putter k -> Putter (Tree k)
putTree Putter k
p = forall k a. Putter k -> Putter a -> Putter (Map k a)
putMapOf Putter k
p (forall k. Ord k => Putter k -> Putter (Tree k)
putTree Putter k
p) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e. Tree e -> Map e (Tree e)
children

putText :: Putter T.Text
putText :: Putter Text
putText = forall a. Putter a -> Putter [a]
putListOf Putter Word8
putWord8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> [Word8]
BS.unpack forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ByteString
U8.fromString forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack

putDataStructure :: Putter DataStructure
putDataStructure :: Putter DataStructure
putDataStructure = forall a b. Putter a -> Putter b -> Putter (a, b)
putTwoOf (forall k. Ord k => Putter k -> Putter (Tree k)
putTree Putter Text
putText) (forall k. Ord k => Putter k -> Putter (Tree k)
putTree Putter Text
putText)