module Data.FilePlow.Ordered
( SeekTarget(..), seekTo )
where
import Data.FilePlow
import Numeric.Search
data SeekTarget b
= StLargerThan !b
| StSmallerThan !b
deriving (Show, Eq)
seekTo ::
(Ord b, Eq b, PlowHandle hdl)
=> hdl
-> SeekTarget b
-> (hdl -> IO b)
-> IO Bool
seekTo hdl st extract =
do s <- pFileSize hdl
ranges <- searchM (fromTo 0 (s 1)) divForever $ \pos ->
do case st of
StLargerThan _ -> pSeek hdl AbsoluteSeek pos
StSmallerThan _ -> pSeek hdl AbsoluteSeek (s 1 pos)
val <- extract hdl
pure $
case st of
StLargerThan x -> (val >= x)
StSmallerThan x -> (val <= x)
let tgtVal =
case st of
StSmallerThan _ -> largest True ranges
StLargerThan _ -> smallest True ranges
case tgtVal of
Just pos ->
case st of
StLargerThan _ -> pSeek hdl AbsoluteSeek pos >> pure True
StSmallerThan _ -> pSeek hdl AbsoluteSeek (s 1 pos) >> pure True
Nothing -> pure False