module Network.DNS.Cache.Value where
import Data.Array.Unboxed
import Data.IORef (newIORef, atomicModifyIORef')
import Network.DNS.Cache.Types
positiveEntry :: [HostAddress] -> IO Entry
positiveEntry addrs = do
ref <- newIORef next
let !val = Value arr ref
return $! Right val
where
!siz = length addrs
!next = adjust 0 (siz1)
!arr = listArray (0,siz1) addrs
rotate :: Value -> IO HostAddress
rotate (Value a ref) = do
let (_, siz) = bounds a
j <- atomicModifyIORef' ref $ \i -> (adjust i siz, i)
let !addr = a ! j
return addr
adjust :: Int -> Int -> Int
adjust i 0 = i
adjust i n = let !x = (i + 1) `mod` (n + 1) in x