lsm-tree-1.0.0.0: src-extras/Database/LSMTree/Extras.hs
module Database.LSMTree.Extras (
showPowersOf10
, showPowersOf
, showRangesOf
, groupsOfN
, vgroupsOfN
) where
import Data.List (find)
import qualified Data.List as List
import Data.List.NonEmpty (NonEmpty)
import qualified Data.List.NonEmpty as NE
import Data.Maybe (fromJust)
import qualified Data.Vector as V
import Text.Printf
showPowersOf10 :: Int -> String
showPowersOf10 = showPowersOf 10
showPowersOf :: Int -> Int -> String
showPowersOf factor n
| factor <= 1 = error "showPowersOf: factor must be larger than 1"
| n < 0 = "n < 0"
| n == 0 = "n == 0"
| otherwise = printf "%d <= n < %d" lb ub
where
ub = fromJust (find (n <) (iterate (* factor) factor))
lb = ub `div` factor
showRangesOf :: Int -> Int -> String
showRangesOf range n
| range <= 0 = error "showRangesOf: range must be larger than 0"
| n == 0 = "n == 0"
| m == 0 = printf "%d < n < %d" lb ub
| otherwise = printf "%d <= n < %d" lb ub
where
m = n `div` range
lb = m * range
ub = (m + 1) * range
-- | Make groups of @n@ elements from a list @xs@
groupsOfN :: Int -> [a] -> [NonEmpty a]
groupsOfN n
| n <= 0 = error "groupsOfN: n <= 0"
| otherwise = List.unfoldr f
where f xs = let (ys, zs) = List.splitAt n xs
in (,zs) <$> NE.nonEmpty ys
-- | Make groups of @n@ elements from a vector @xs@
vgroupsOfN :: Int -> V.Vector a -> V.Vector (V.Vector a)
vgroupsOfN n
| n <= 0 = error "groupsOfN: n <= 0"
| otherwise = V.unfoldr f
where
f xs
| V.null xs
= Nothing
| otherwise
= Just $ V.splitAt n xs