{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE FlexibleInstances #-}

module HaskellWorks.Data.Xml.Index
  ( Index(..)
  , indexVersion
  ) where

import Control.DeepSeq
import Data.Serialize
import Data.Word
import GHC.Generics
import HaskellWorks.Data.Bits.BitShown

import qualified Data.Vector.Storable as DVS

indexVersion :: String
indexVersion :: String
indexVersion = String
"1.0"

data Index = Index
  { Index -> String
xiVersion        :: String
  , Index -> BitShown (Vector Word64)
xiInterests      :: BitShown (DVS.Vector Word64)
  , Index -> BitShown (Vector Word64)
xiBalancedParens :: BitShown (DVS.Vector Word64)
  } deriving (Index -> Index -> Bool
(Index -> Index -> Bool) -> (Index -> Index -> Bool) -> Eq Index
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Index -> Index -> Bool
== :: Index -> Index -> Bool
$c/= :: Index -> Index -> Bool
/= :: Index -> Index -> Bool
Eq, Int -> Index -> ShowS
[Index] -> ShowS
Index -> String
(Int -> Index -> ShowS)
-> (Index -> String) -> ([Index] -> ShowS) -> Show Index
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Index -> ShowS
showsPrec :: Int -> Index -> ShowS
$cshow :: Index -> String
show :: Index -> String
$cshowList :: [Index] -> ShowS
showList :: [Index] -> ShowS
Show, (forall x. Index -> Rep Index x)
-> (forall x. Rep Index x -> Index) -> Generic Index
forall x. Rep Index x -> Index
forall x. Index -> Rep Index x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Index -> Rep Index x
from :: forall x. Index -> Rep Index x
$cto :: forall x. Rep Index x -> Index
to :: forall x. Rep Index x -> Index
Generic, Index -> ()
(Index -> ()) -> NFData Index
forall a. (a -> ()) -> NFData a
$crnf :: Index -> ()
rnf :: Index -> ()
NFData)

putBitShownVector :: Putter (BitShown (DVS.Vector Word64))
putBitShownVector :: Putter (BitShown (Vector Word64))
putBitShownVector = Vector Word64 -> Put
putVector (Vector Word64 -> Put)
-> (BitShown (Vector Word64) -> Vector Word64)
-> Putter (BitShown (Vector Word64))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BitShown (Vector Word64) -> Vector Word64
forall a. BitShown a -> a
bitShown

getBitShownVector :: Get (BitShown (DVS.Vector Word64))
getBitShownVector :: Get (BitShown (Vector Word64))
getBitShownVector = Vector Word64 -> BitShown (Vector Word64)
forall a. a -> BitShown a
BitShown (Vector Word64 -> BitShown (Vector Word64))
-> Get (Vector Word64) -> Get (BitShown (Vector Word64))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Get (Vector Word64)
getVector

putVector :: DVS.Vector Word64 -> Put
putVector :: Vector Word64 -> Put
putVector Vector Word64
v = do
  let len :: Int
len = Vector Word64 -> Int
forall a. Storable a => Vector a -> Int
DVS.length Vector Word64
v
  Putter Int
forall t. Serialize t => Putter t
put Int
len
  Vector Word64 -> (Word64 -> Put) -> Put
forall (m :: * -> *) a b.
(Monad m, Storable a) =>
Vector a -> (a -> m b) -> m ()
DVS.forM_ Vector Word64
v Word64 -> Put
forall t. Serialize t => Putter t
put

getVector :: Get (DVS.Vector Word64)
getVector :: Get (Vector Word64)
getVector = do
  Int
len <- Get Int
forall t. Serialize t => Get t
get
  Int -> (Int -> Get Word64) -> Get (Vector Word64)
forall (m :: * -> *) a.
(Monad m, Storable a) =>
Int -> (Int -> m a) -> m (Vector a)
DVS.generateM Int
len (Get Word64 -> Int -> Get Word64
forall a b. a -> b -> a
const Get Word64
forall t. Serialize t => Get t
get)

instance Serialize Index where
  put :: Putter Index
put Index
xi = do
    Putter String
forall t. Serialize t => Putter t
put               Putter String -> Putter String
forall a b. (a -> b) -> a -> b
$ Index -> String
xiVersion         Index
xi
    Putter (BitShown (Vector Word64))
putBitShownVector Putter (BitShown (Vector Word64))
-> Putter (BitShown (Vector Word64))
forall a b. (a -> b) -> a -> b
$ Index -> BitShown (Vector Word64)
xiInterests       Index
xi
    Putter (BitShown (Vector Word64))
putBitShownVector Putter (BitShown (Vector Word64))
-> Putter (BitShown (Vector Word64))
forall a b. (a -> b) -> a -> b
$ Index -> BitShown (Vector Word64)
xiBalancedParens  Index
xi

  get :: Get Index
get = do
    String
version   <- Get String
forall t. Serialize t => Get t
get
    BitShown (Vector Word64)
ib        <- Get (BitShown (Vector Word64))
getBitShownVector
    BitShown (Vector Word64)
bp        <- Get (BitShown (Vector Word64))
getBitShownVector
    Index -> Get Index
forall a. a -> Get a
forall (m :: * -> *) a. Monad m => a -> m a
return (Index -> Get Index) -> Index -> Get Index
forall a b. (a -> b) -> a -> b
$ String
-> BitShown (Vector Word64) -> BitShown (Vector Word64) -> Index
Index String
version BitShown (Vector Word64)
ib BitShown (Vector Word64)
bp