Something went wrong. Try again.
Mutable List builder in the ST Monad
Something went wrong. Try again.
3.2 kB · 135 lines
Haskell
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136{-# LANGUAGE TemplateHaskell #-}
import Hedgehogimport qualified Hedgehog.Gen as Genimport qualified Hedgehog.Range as Rangeimport qualified Hedgehog.Main as Main
import Control.Monad.STimport Data.Foldableimport Data.IORef
import qualified Data.ListBuilder as ListBuilderimport Data.Traversable.IO
prop_cons :: Propertyprop_cons = property $ do xs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha let result = runST $ do bldr <- ListBuilder.newBuilder for_ xs $ \x -> ListBuilder.append x bldr ListBuilder.freeze bldr result === xs
prop_reverses :: Propertyprop_reverses = property $ do xs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha let result = runST $ do bldr <- ListBuilder.newBuilder for_ xs $ \x -> ListBuilder.prepend x bldr ListBuilder.freeze bldr reverse result === xs
prop_sequenceIO :: Propertyprop_sequenceIO = property $ do refs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha xs <- evalIO $ sequenceIO (fmap return refs) xs === refs
prop_unfoldIO :: Propertyprop_unfoldIO = property $ do refs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha
items <- evalIO $ newIORef refs xs <- evalIO $ unfoldIO $ do remaining <- readIORef items case remaining of [] -> return Nothing n : ns -> do writeIORef items ns return (Just n)
xs === refs
prop_freeze_is_safe :: Propertyprop_freeze_is_safe = property $ do xs <- forAll $ Gen.list (Range.linear 0 100) Gen.alpha y <- forAll Gen.alpha z <- forAll Gen.alpha let (result, withTips) = runST $ do bldr <- ListBuilder.newBuilder for_ xs $ \x -> ListBuilder.append x bldr
built <- ListBuilder.freeze bldr
ListBuilder.append y bldr ListBuilder.prepend z bldr
withTips' <- ListBuilder.freeze bldr
return (built, withTips')
result === xs withTips === (z : xs <> [y])
prop_filter_in_place :: Propertyprop_filter_in_place = property $ do xs <- forAll $ Gen.list (Range.linear 0 100) (Gen.int (Range.linear 0 10)) let result = runST $ do bldr <- ListBuilder.newBuilder for_ xs $ \x -> ListBuilder.append x bldr
ListBuilder.filterInPlace even bldr ListBuilder.freeze bldr
result === filter even xs
prop_insert_satisfies :: Propertyprop_insert_satisfies = do property $ do let gInt = Gen.int (Range.linear 0 10) xs <- forAll $ Gen.list (Range.linear 0 100) gInt aa <- forAll gInt ys <- forAll $ Gen.list (Range.linear 0 100) gInt let result = runST $ do bldr <- ListBuilder.newBuilder for_ xs $ \x -> ListBuilder.append x bldr for_ ys $ \x -> ListBuilder.append x bldr
ListBuilder.insert (length xs) aa bldr
ListBuilder.unsafeFreeze bldr
result === xs <> [aa] <> ys
tests :: IO Booltests = checkParallel $$(discover)
main :: IO ()main = Main.defaultMain [ tests ]