asif-1.0.0: src/Arbor/File/Format/Asif/Lookup.hs
module Arbor.File.Format.Asif.Lookup where
import Control.Monad
import Data.Text (Text)
import qualified Data.ByteString.Lazy as LBS
import qualified Data.Map.Strict as M
import qualified Data.Vector.Unboxed as VU
binarySearch :: (Ord a, VU.Unbox a) => a -> VU.Vector a -> Maybe Int
binarySearch key values = do
guard (not (VU.null values))
let idx = s 0 (VU.length values - 1)
guard (idx > -1)
return idx
where
s l h
| l >= h =
if (values VU.! h) <= key then h else -1
| otherwise = do
let m = l + (h - l) `div` 2
if (values VU.! m) > key then s l m
else do
let result = s (m + 1) h
if result == -1 then m
else result
binarySearchExact :: (Ord a, VU.Unbox a) => a -> VU.Vector a -> Maybe Int
binarySearchExact key values = go values key 0 (VU.length values - 1)
where
go hay needle lo hi
| hi < lo = Nothing
| pivot > needle = go hay needle lo (mid - 1)
| pivot < needle = go hay needle (mid + 1) hi
| otherwise = Just mid
where
mid = lo + (hi - lo) `div` 2
pivot = hay VU.! mid
lookupSegment :: Text -> M.Map Text LBS.ByteString -> (LBS.ByteString -> [a]) -> [a]
lookupSegment filename directory f = case M.lookup filename directory of
Just bs -> f bs
Nothing -> []