{-# OPTIONS  -XDeriveDataTypeable
             -XTypeSynonymInstances
             -XMultiParamTypeClasses
             -XExistentialQuantification
             -XOverloadedStrings
             -XFlexibleInstances
             -XUndecidableInstances
             -XFunctionalDependencies
             -XFlexibleContexts
             -XIncoherentInstances
             -IControl/Workflow
             -XCPP #-}
{-# OPTIONS -IData/Persistent/Queue       #-}
{- |
This module implements a persistent, transactional collection with Queue interface as well as indexed access by key
This module uses `Data.Binary` for serialization.

Here @QueueConstraints w r a@ means  @Data.Binary.Binary a@

For optimal (de)serialization if you store in the queue different versions of largue structures , for
example, documents you better use  "Data.RefSerialize"  and "Data.Persistent.Queue.Text" Instead.

-}
module Data.Persistent.Queue.Binary(
RefQueue(..),  getQRef,
pop,popSTM,pick,Data.Persistent.Queue.Binary.flush, flushSTM,
pickAll, pickAllSTM, push,pushSTM,
pickElem, pickElemSTM,  readAll, readAllSTM,
deleteElem, deleteElemSTM,
unreadSTM,Data.Persistent.Queue.Binary.isEmpty,isEmptySTM
) where
import Data.Typeable
import Control.Concurrent.STM(STM,atomically, retry)
import Control.Monad(when)
import Data.TCache.DefaultPersistence

import Data.TCache
import System.IO.Unsafe
import Data.IORef

import Data.ByteString.Lazy.Char8

import Control.Workflow.GenSerializer

import Data.Binary
import Data.Binary.Put
import Data.Binary.Get

instance SerialiserString PutM Get where
  serialString= put
  deserialString= get


instance Indexable (Queue a) where
  key (Queue k  _ _)= queuePrefix ++ k
  defPath _=  "WorkflowState/Binary/"

#include "Queue.inc.hs"