{-# 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