packages feed

futhark-0.28.1: src/Language/Futhark/Interpreter/FFI/AtomicList.hs

module Language.Futhark.Interpreter.FFI.AtomicList
  ( AtomicList,
    new,
    prepend,
    flush,
  )
where

import Data.IORef (IORef, atomicModifyIORef, newIORef)

newtype AtomicList v = AtomicList (IORef [v])

new :: IO (AtomicList v)
new = AtomicList <$> newIORef []

prepend :: v -> AtomicList v -> IO ()
prepend v (AtomicList r) = atomicModifyIORef r $ (,()) . (v :)

flush :: AtomicList v -> IO [v]
flush (AtomicList r) = atomicModifyIORef r ([],)