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

module Octane.Type.CacheItem (CacheItem(..)) where

import Octane.Core
import Octane.Type.CacheProperty
import Octane.Type.Primitive.List
import Octane.Type.Primitive.Word32LE

data CacheItem = CacheItem
    { cacheItemTag :: Word32LE
    , cacheItemStart :: Word32LE
    , cacheItemEnd :: Word32LE
    , cacheItemCacheProperties :: List CacheProperty
    } deriving (Eq, Generic, NFData, Show)

instance Binary CacheItem where
    get = do
        tag <- get
        start <- get
        end <- get
        cacheProperties <- get
        return CacheItem
            { cacheItemTag = tag
            , cacheItemStart = start
            , cacheItemEnd = end
            , cacheItemCacheProperties = cacheProperties
            }

    put cacheItem = do
        cacheItem & cacheItemTag & put
        cacheItem & cacheItemStart & put
        cacheItem & cacheItemEnd & put
        cacheItem & cacheItemCacheProperties & put