packages feed

apply-merge-0.1.1.0: test/Test/Data/PQueue/Prio/Min/Mutable.hs

-- SPDX-FileCopyrightText: Copyright Preetham Gujjula
-- SPDX-License-Identifier: BSD-3-Clause

module Test.Data.PQueue.Prio.Min.Mutable (tests) where

import Control.Monad (forM_, replicateM)
import Control.Monad.ST (runST)
import Data.List (sort)
import Data.Maybe (catMaybes)
import Data.PQueue.Prio.Min.Mutable
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.QuickCheck (testProperty)

tests :: TestTree
tests =
  testGroup
    "Data.PQueue.Prio.Min.Mutable"
    [ testProperty "priority queue sorts a list" prop_sorts_list
    ]

prop_sorts_list :: [Int] -> Bool
prop_sorts_list xs = pqueueSort xs == sort xs

pqueueSort :: (Ord a) => [a] -> [a]
pqueueSort xs = runST $ do
  queue <- empty
  forM_ xs $ \x -> insert x () queue
  map fst . catMaybes <$> replicateM (length xs) (deleteMin queue)