module Codec.Container.Ogg.Serial (
Serial,
Serialled,
serialOf,
demux,
genSerial
) where
import Data.Word (Word32)
import System.Random
import Codec.Container.Ogg.List
type Serial = Word32
class Serialled a where
serialOf :: a -> Serial
serialEq :: (Serialled a, Serialled b) => a -> b -> Bool
serialEq a b = (serialOf a) == (serialOf b)
demux :: (Serialled a) => [a] -> [[a]]
demux = classify serialEq
instance Random Serial where
randomR = integralRandomR
random = randomR (0,0xffffffff1)
integralRandomR :: (Integral a, RandomGen g) => (a,a) -> g -> (a,g)
integralRandomR (a,b) g = case randomR (fromIntegral a :: Integer,
fromIntegral b :: Integer) g of
(x,g') -> (fromIntegral x, g')
genSerial :: IO Serial
genSerial = do
serialno <- getStdRandom random
return serialno