{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Key.Bytes where import Control.DeepSeq import Control.Monad (replicateM) import Data.ByteString.Short import Data.Hashable import Data.List import System.Random.Stateful newtype Bytes = Bytes {unBytes :: ShortByteString} deriving (Eq, Hashable, Show, NFData) genBytes :: (StatefulGen g m) => Int -> g -> m Bytes genBytes len gen = Bytes <$> uniformShortByteStringM len gen genNBytes :: (StatefulGen g m) => Int -> Int -> g -> m [Bytes] genNBytes n len = replicateM n . genBytes len -- | @genDisjoint n len gen@ generates @n@ 'Bytes' in total. The returned lists -- each contain roughly half of the total. genDisjoint :: (StatefulGen g m) => Int -> -- | Must be positive Int -> g -> m ([Bytes], [Bytes]) genDisjoint n len gen = Data.List.partition predicate <$> genNBytes n len gen where predicate (Bytes sbs) = even (Data.ByteString.Short.head sbs) {- instance Uniform Bytes where uniformM = genBytes 32 -}