{-# LANGUAGE    OverloadedStrings        #-}
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}

-- |
-- Simplistic demo of 'Iterator' synchronization, using the 'Base" API
--
module Main where

import Control.Concurrent
import Control.Concurrent.Async
import Control.Exception
import Data.Default

import Database.LevelDB.Base

import qualified Data.ByteString.Char8 as BS

main :: IO ()
main = bracket (open "/tmp/leveltest" def{ createIfMissing = True }) close $ \ db -> do

    let xs = [1..100] :: [Int]

    write db def (map (\ x -> Put (BS.pack . show $ x) "") xs)

    bracket (createIter db def) releaseIter $ \ iter -> do
        _   <- iterFirst iter
        lck <- newMVar iter
        es  <- mapConcurrently (getEntry lck) xs
        mapM (\ (i,e) -> putStrLn $ "#" ++ show i ++ ": " ++ show e) es

    return ()
  where
    getEntry lck i = withMVar lck $ \ iter -> do
        entry <- iterEntry iter
        iterNext iter
        return (i, entry)