-- | Functions related to overflow pages. module Data.BTree.Impure.Internal.Overflow where import Prelude hiding (max, mapM) import Control.Applicative ((<$>)) import Data.Binary (encode) import Data.Map (Map) import Data.Traversable (mapM) import qualified Data.ByteString.Lazy as BL import Data.BTree.Alloc.Class import Data.BTree.Impure.Internal.Structures import Data.BTree.Primitives toLeafValue :: (AllocM m, Value v) => v -> m (LeafValue v) toLeafValue v = do max <- maxValueSize if BL.length (encode v) <= fromIntegral max then return $ RawValue v else OverflowValue <$> allocOverflow v fromLeafValue :: (AllocReaderM m, Value v) => LeafValue v -> m v fromLeafValue (RawValue v) = return v fromLeafValue (OverflowValue oid) = readOverflow oid toLeafItems :: (AllocM m, Value v) => Map k v -> m (LeafItems k v) toLeafItems = mapM toLeafValue fromLeafItems :: (AllocReaderM m, Value v) => LeafItems k v -> m (Map k v) fromLeafItems = mapM fromLeafValue