Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-psqueues for openSUSE:Factory 
checked in at 2023-11-08 22:17:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-psqueues (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-psqueues.new.17445 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-psqueues"

Wed Nov  8 22:17:43 2023 rev:7 rq:1124061 version:0.2.8.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-psqueues/ghc-psqueues.changes        
2023-04-04 21:22:46.461996786 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-psqueues.new.17445/ghc-psqueues.changes     
2023-11-08 22:18:01.999846403 +0100
@@ -1,0 +2,21 @@
+Fri Oct 27 15:51:37 UTC 2023 - Peter Simons <psim...@suse.com>
+
+- Update psqueues to version 0.2.8.0.
+  - 0.2.8.0 (2022-10-27)
+      * Add a number of minor optimizations and INLINE pragmas:
+          - The previous `INLINABLE` pragmas were insufficient to fully 
specialize
+            functions. Add a bunch more. I believe they now do the job they 
were
+            meant to.
+          - Change the way we check for very short queues in `lbalance` and
+            `rbalance` to avoid redundant size comparisons in the non-short
+            case.
+          - Make the fields of `Play` strict. I doubt this makes any practical
+            difference, since `tourView` is `INLINE`, but in fact the fields 
are
+            always in WHNF, so we might as well make that explicitly clear.
+      * Fix a bug in `fromList`. It previously used the *first* occurrence
+        of a duplicated key; it now uses the *last* occurrence, as documented.
+      * Cleanup: refactor `binShrinkL` and `binShrinkR` into `bin`.
+      * Bump deepseq upper bound to 1.6
+      * Bump tasty upper bound to 1.6
+
+-------------------------------------------------------------------

Old:
----
  psqueues-0.2.7.3.tar.gz

New:
----
  psqueues-0.2.8.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-psqueues.spec ++++++
--- /var/tmp/diff_new_pack.sV3F7s/_old  2023-11-08 22:18:03.363896513 +0100
+++ /var/tmp/diff_new_pack.sV3F7s/_new  2023-11-08 22:18:03.367896660 +0100
@@ -20,7 +20,7 @@
 %global pkgver %{pkg_name}-%{version}
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.2.7.3
+Version:        0.2.8.0
 Release:        0
 Summary:        Pure priority search queues
 License:        BSD-3-Clause

++++++ psqueues-0.2.7.3.tar.gz -> psqueues-0.2.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/CHANGELOG 
new/psqueues-0.2.8.0/CHANGELOG
--- old/psqueues-0.2.7.3/CHANGELOG      2021-11-05 18:37:16.000000000 +0100
+++ new/psqueues-0.2.8.0/CHANGELOG      2023-10-27 17:49:25.000000000 +0200
@@ -1,5 +1,22 @@
 # CHANGELOG
 
+- 0.2.8.0 (2022-10-27)
+    * Add a number of minor optimizations and INLINE pragmas:
+        - The previous `INLINABLE` pragmas were insufficient to fully 
specialize
+          functions. Add a bunch more. I believe they now do the job they were
+          meant to.
+        - Change the way we check for very short queues in `lbalance` and
+          `rbalance` to avoid redundant size comparisons in the non-short
+          case.
+        - Make the fields of `Play` strict. I doubt this makes any practical
+          difference, since `tourView` is `INLINE`, but in fact the fields are
+          always in WHNF, so we might as well make that explicitly clear.
+    * Fix a bug in `fromList`. It previously used the *first* occurrence
+      of a duplicated key; it now uses the *last* occurrence, as documented.
+    * Cleanup: refactor `binShrinkL` and `binShrinkR` into `bin`.
+    * Bump deepseq upper bound to 1.6
+    * Bump tasty upper bound to 1.6
+
 - 0.2.7.3 (2021-11-05)
     * Relax hashable, tasty and QuickCheck upper bounds
     * Bump Cabal-version to 1.10
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/psqueues-0.2.7.3/benchmarks/Data/FingerTree/PSQueue/Benchmark.hs 
new/psqueues-0.2.8.0/benchmarks/Data/FingerTree/PSQueue/Benchmark.hs
--- old/psqueues-0.2.7.3/benchmarks/Data/FingerTree/PSQueue/Benchmark.hs        
2021-11-05 18:30:31.000000000 +0100
+++ new/psqueues-0.2.8.0/benchmarks/Data/FingerTree/PSQueue/Benchmark.hs        
1970-01-01 01:00:00.000000000 +0100
@@ -1,61 +0,0 @@
-{-# LANGUAGE BangPatterns #-}
-
--- | This module contains benchmarks for the 'PSQueue' type from the
--- `fingertree-psqueue` package.
-module Data.FingerTree.PSQueue.Benchmark
-    ( benchmark
-    ) where
-
-import           Data.List (foldl')
-import           Data.FingerTree.PSQueue (Binding (..))
-import qualified Data.FingerTree.PSQueue as PSQueue
-import           Criterion.Main
-import           Prelude hiding (lookup)
-import           BenchmarkTypes
-import           Data.Maybe (fromMaybe)
-
-benchmark :: String -> [BElem] -> BenchmarkSet
-benchmark name elems = BenchmarkSet
-    { bGroupName        = name
-    , bMinView          = whnf bench_minView              initialPSQ
-    , bLookup           = whnf (bench_lookup keys)        initialPSQ
-    , bInsertEmpty      = nf'  (bench_insert firstElems)  PSQueue.empty
-    , bInsertNew        = nf'  (bench_insert secondElems) initialPSQ
-    , bInsertDuplicates = nf'  (bench_insert firstElems)  initialPSQ
-    , bDelete           = nf'  (bench_delete firstKeys)   initialPSQ
-    }
-  where
-    (firstElems, secondElems) = splitAt (numElems `div` 2) elems
-    numElems  = length elems
-    keys      = map (\(x, _, _) -> x) elems
-    firstKeys = map (\(x, _, _) -> x) firstElems
-
-    initialPSQ :: PSQueue.PSQ Int Int
-    initialPSQ = PSQueue.fromList $ map toBinding firstElems
-
-    toBinding :: BElem -> Binding Int Int
-    toBinding (k, p, _) = k :-> p
-
-    -- Get the size of the resulting PSQs, since there's no NFData instance
-    nf' f x = whnf (PSQueue.size . f) x
-
-bench_lookup :: [Int] -> PSQueue.PSQ Int Int -> Int
-bench_lookup xs m = foldl' (\n k -> fromMaybe n (PSQueue.lookup k m)) 0 xs
-
-bench_insert :: [BElem] -> PSQueue.PSQ Int Int -> PSQueue.PSQ Int Int
-bench_insert xs m0 = foldl' (\m (k, p, _) -> fingerInsert k p m) m0 xs
-  where
-    fingerInsert
-        :: (Ord k, Ord v) => k -> v -> PSQueue.PSQ k v -> PSQueue.PSQ k v
-    fingerInsert k v m = PSQueue.alter (const $ Just v) k m
-
-bench_minView :: PSQueue.PSQ Int Int -> Int
-bench_minView = go 0
-  where
-    go !n t = case PSQueue.minView t of
-      Nothing              -> n
-      Just ((k :-> x), t') -> go (n + k + x) t'
-
--- Empty a queue by sequentially removing all elements
-bench_delete :: [Int] -> PSQueue.PSQ Int Int -> PSQueue.PSQ Int Int
-bench_delete keys t0 = foldl' (\t k -> PSQueue.delete k t) t0 keys
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/benchmarks/Main.hs 
new/psqueues-0.2.8.0/benchmarks/Main.hs
--- old/psqueues-0.2.7.3/benchmarks/Main.hs     2021-11-05 18:30:31.000000000 
+0100
+++ new/psqueues-0.2.8.0/benchmarks/Main.hs     2023-10-27 17:45:24.000000000 
+0200
@@ -10,7 +10,6 @@
 import qualified Data.IntPSQ.Benchmark              as IntPSQ
 import qualified Data.HashPSQ.Benchmark             as HashPSQ
 import qualified Data.PSQueue.Benchmark             as PSQueue
-import qualified Data.FingerTree.PSQueue.Benchmark  as FingerPSQ
 
 benchmarkSize :: Int
 benchmarkSize = 2 ^ (12 :: Int)
@@ -47,7 +46,4 @@
     , PSQueue.benchmark   "PSQueue increasing"            increasing
     , PSQueue.benchmark   "PSQueue decreasing"            decreasing
     , PSQueue.benchmark   "PSQueue semirandom"            semirandom
-    , FingerPSQ.benchmark "FingerTree PSQueue increasing" increasing
-    , FingerPSQ.benchmark "FingerTree PSQueue decreasing" decreasing
-    , FingerPSQ.benchmark "FingerTree PSQueue semirandom" semirandom
     ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/psqueues.cabal 
new/psqueues-0.2.8.0/psqueues.cabal
--- old/psqueues-0.2.7.3/psqueues.cabal 2021-11-05 18:36:43.000000000 +0100
+++ new/psqueues-0.2.8.0/psqueues.cabal 2023-10-27 17:49:07.000000000 +0200
@@ -1,5 +1,5 @@
 Name:          psqueues
-Version:       0.2.7.3
+Version:       0.2.8.0
 License:       BSD3
 License-file:  LICENSE
 Maintainer:    Jasper Van der Jeugt <jasper...@gmail.com>
@@ -8,6 +8,7 @@
 Category:      Data Structures
 Build-type:    Simple
 Cabal-version: >=1.10
+Tested-with: GHC==9.6.1, GHC==9.4.2, GHC==9.2.2, GHC==9.0.2, GHC==8.10.7, 
GHC==8.8.4, GHC==8.6.5, GHC==8.4.4, GHC==8.2.2, GHC==8.0.2
 
 Description:
     The psqueues package provides
@@ -66,7 +67,7 @@
 
     Build-depends:
           base     >= 4.2     && < 5
-        , deepseq  >= 1.2     && < 1.5
+        , deepseq  >= 1.2     && < 1.6
         , hashable >= 1.1.2.3 && < 1.5
 
     if impl(ghc>=6.10)
@@ -92,7 +93,6 @@
     Other-modules:
         BenchmarkTypes
         Data.BitUtil
-        Data.FingerTree.PSQueue.Benchmark
         Data.HashPSQ
         Data.HashPSQ.Benchmark
         Data.HashPSQ.Internal
@@ -109,7 +109,6 @@
         , unordered-containers >= 0.2.4
         , criterion            >= 0.8
         , mtl                  >= 2.1
-        , fingertree-psqueue   >= 0.3
         , PSQueue              >= 1.1
         , random               >= 1.0
 
@@ -146,7 +145,7 @@
     Build-depends:
           HUnit            >= 1.2 && < 1.7
         , QuickCheck       >= 2.7 && < 2.15
-        , tasty            >= 1.2 && < 1.5
+        , tasty            >= 1.2 && < 1.6
         , tasty-hunit      >= 0.9 && < 0.11
         , tasty-quickcheck >= 0.8 && < 0.11
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/src/Data/IntPSQ/Internal.hs 
new/psqueues-0.2.8.0/src/Data/IntPSQ/Internal.hs
--- old/psqueues-0.2.7.3/src/Data/IntPSQ/Internal.hs    2021-11-05 
18:30:31.000000000 +0100
+++ new/psqueues-0.2.8.0/src/Data/IntPSQ/Internal.hs    2023-10-27 
17:45:24.000000000 +0200
@@ -282,8 +282,8 @@
         Bin k' p' x' m l r
           | nomatch k k' m -> t
           | k == k'        -> merge m l r
-          | zero k m       -> binShrinkL k' p' x' m (go l) r
-          | otherwise      -> binShrinkR k' p' x' m l      (go r)
+          | zero k m       -> bin k' p' x' m (go l) r
+          | otherwise      -> bin k' p' x' m l      (go r)
 
 -- | /O(min(n,W))/ Delete the binding with the least priority, and return the
 -- rest of the queue stripped of that binding. In case the queue is empty, the
@@ -336,19 +336,11 @@
                            | p' <= p   -> (b, Bin k p' x' m l r)
                            | otherwise -> (b, unsafeInsertNew k p' x' (merge m 
l r))
 
--- | Smart constructor for a 'Bin' node whose left subtree could have become
--- 'Nil'.
-{-# INLINE binShrinkL #-}
-binShrinkL :: Key -> p -> v -> Mask -> IntPSQ p v -> IntPSQ p v -> IntPSQ p v
-binShrinkL k p x m Nil r = case r of Nil -> Tip k p x; _ -> Bin k p x m Nil r
-binShrinkL k p x m l   r = Bin k p x m l r
-
--- | Smart constructor for a 'Bin' node whose right subtree could have become
--- 'Nil'.
-{-# INLINE binShrinkR #-}
-binShrinkR :: Key -> p -> v -> Mask -> IntPSQ p v -> IntPSQ p v -> IntPSQ p v
-binShrinkR k p x m l Nil = case l of Nil -> Tip k p x; _ -> Bin k p x m l Nil
-binShrinkR k p x m l r   = Bin k p x m l r
+-- | Smart constructor for a 'Bin' node.
+{-# INLINE bin #-}
+bin :: Key -> p -> v -> Mask -> IntPSQ p v -> IntPSQ p v -> IntPSQ p v
+bin k p x _ Nil Nil = Tip k p x
+bin k p x m l   r   = Bin k p x m l r
 
 
 ------------------------------------------------------------------------------
@@ -413,11 +405,11 @@
                        in  t' `seq` (# t', Just (p', x') #)
 
         | zero k m  -> case delFrom l of
-                         (# l', mbPX #) -> let t' = binShrinkL k' p' x' m l' r
+                         (# l', mbPX #) -> let t' = bin k' p' x' m l' r
                                            in  t' `seq` (# t', mbPX #)
 
         | otherwise -> case delFrom r of
-                         (# r', mbPX #) -> let t' = binShrinkR k' p' x' m l  r'
+                         (# r', mbPX #) -> let t' = bin k' p' x' m l  r'
                                            in  t' `seq` (# t', mbPX #)
 
 -- | /O(min(n,W))/ Retrieve the binding with the least priority, and the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/src/Data/OrdPSQ/Internal.hs 
new/psqueues-0.2.8.0/src/Data/OrdPSQ/Internal.hs
--- old/psqueues-0.2.7.3/src/Data/OrdPSQ/Internal.hs    2021-11-05 
18:30:31.000000000 +0100
+++ new/psqueues-0.2.8.0/src/Data/OrdPSQ/Internal.hs    2023-10-27 
17:45:24.000000000 +0200
@@ -71,7 +71,7 @@
     ) where
 
 import           Control.DeepSeq  (NFData (rnf))
-import           Data.Foldable    (Foldable (foldr))
+import           Data.Foldable    (Foldable (foldl'))
 import qualified Data.List        as List
 import           Data.Maybe       (isJust)
 import           Data.Traversable
@@ -290,7 +290,7 @@
 -- last priority and value for the key is retained.
 {-# INLINABLE fromList #-}
 fromList :: (Ord k, Ord p) => [(k, p, v)] -> OrdPSQ k p v
-fromList = foldr (\(k, p, v) q -> insert k p v q) empty
+fromList = foldl' (\q (k, p, v) -> insert k p v q) empty
 
 -- | /O(n)/ Convert a queue to a list of (key, priority, value) tuples. The
 -- order of the list is not specified.
@@ -302,7 +302,7 @@
 keys t = [k | (k, _, _) <- toList t]
 -- TODO (jaspervdj): There must be faster implementations.
 
--- | /O(n)/ Convert to an ascending list.
+-- | /O(n)/ Convert to a list in ascending order by key.
 toAscList :: OrdPSQ k p v -> [(k, p, v)]
 toAscList q  = seqToList (toAscLists q)
   where
@@ -352,6 +352,7 @@
 minView Void                   = Nothing
 minView (Winner (E k p v) t m) = Just (k, p, v, secondBest t m)
 
+{-# INLINABLE secondBest #-}
 secondBest :: (Ord k, Ord p) => LTree k p v -> k -> OrdPSQ k p v
 secondBest Start _                 = Void
 secondBest (LLoser _ e tl m tr) m' = Winner e tl m `play` secondBest tr m'
@@ -360,6 +361,7 @@
 -- | Return a list of elements ordered by key whose priorities are at most 
@pt@,
 -- and the rest of the queue stripped of these elements.  The returned list of
 -- elements can be in any order: no guarantees there.
+{-# INLINABLE atMostView #-}
 atMostView :: (Ord k, Ord p) => p -> OrdPSQ k p v -> ([(k, p, v)], OrdPSQ k p 
v)
 atMostView pt = go []
   where
@@ -448,7 +450,7 @@
 data TourView k p v
     = Null
     | Single {-# UNPACK #-} !(Elem k p v)
-    | Play (OrdPSQ k p v) (OrdPSQ k p v)
+    | Play !(OrdPSQ k p v) !(OrdPSQ k p v)
 
 tourView :: OrdPSQ k p v -> TourView k p v
 tourView Void               = Null
@@ -508,21 +510,26 @@
 lloser k p v tl m tr = LLoser (1 + size' tl + size' tr) (E k p v) tl m tr
 rloser k p v tl m tr = RLoser (1 + size' tl + size' tr) (E k p v) tl m tr
 
+{-# INLINABLE lbalance #-}
+{-# INLINABLE rbalance #-}
 lbalance, rbalance
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
+lbalance k p v Start m r        = lloser        k p v Start m r
+lbalance k p v l m Start        = lloser        k p v l m Start
 lbalance k p v l m r
-    | size' l + size' r < 2     = lloser        k p v l m r
     | size' r > omega * size' l = lbalanceLeft  k p v l m r
     | size' l > omega * size' r = lbalanceRight k p v l m r
     | otherwise                 = lloser        k p v l m r
 
+rbalance k p v Start m r        = rloser        k p v Start m r
+rbalance k p v l m Start        = rloser        k p v l m Start
 rbalance k p v l m r
-    | size' l + size' r < 2     = rloser        k p v l m r
     | size' r > omega * size' l = rbalanceLeft  k p v l m r
     | size' l > omega * size' r = rbalanceRight k p v l m r
     | otherwise                 = rloser        k p v l m r
 
+{-# INLINABLE lbalanceLeft #-}
 lbalanceLeft
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -530,6 +537,7 @@
     | size' (left r) < size' (right r) = lsingleLeft  k p v l m r
     | otherwise                        = ldoubleLeft  k p v l m r
 
+{-# INLINABLE lbalanceRight #-}
 lbalanceRight
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -537,6 +545,7 @@
     | size' (left l) > size' (right l) = lsingleRight k p v l m r
     | otherwise                        = ldoubleRight k p v l m r
 
+{-# INLINABLE rbalanceLeft #-}
 rbalanceLeft
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -544,6 +553,7 @@
     | size' (left r) < size' (right r) = rsingleLeft  k p v l m r
     | otherwise                        = rdoubleLeft  k p v l m r
 
+{-# INLINABLE rbalanceRight #-}
 rbalanceRight
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -551,6 +561,7 @@
     | size' (left l) > size' (right l) = rsingleRight k p v l m r
     | otherwise                        = rdoubleRight k p v l m r
 
+{-# INLINABLE lsingleLeft #-}
 lsingleLeft
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -577,6 +588,7 @@
     lloser k1 p1 v1 t1 m1 (lloser k2 p2 v2 t2 m2 t3)
 lsingleRight _ _ _ _ _ _ = moduleError "lsingleRight" "malformed tree"
 
+{-# INLINABLE rsingleRight #-}
 rsingleRight
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -589,6 +601,7 @@
         rloser k2 p2 v2 t1 m1 (rloser k1 p1 v1 t2 m2 t3)
 rsingleRight _ _ _ _ _ _ = moduleError "rsingleRight" "malformed tree"
 
+{-# INLINABLE ldoubleLeft #-}
 ldoubleLeft
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -598,6 +611,7 @@
     lsingleLeft k1 p1 v1 t1 m1 (rsingleRight k2 p2 v2 t2 m2 t3)
 ldoubleLeft _ _ _ _ _ _ = moduleError "ldoubleLeft" "malformed tree"
 
+{-# INLINABLE ldoubleRight #-}
 ldoubleRight
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -607,6 +621,7 @@
     lsingleRight k1 p1 v1 (rsingleLeft k2 p2 v2 t1 m1 t2) m2 t3
 ldoubleRight _ _ _ _ _ _ = moduleError "ldoubleRight" "malformed tree"
 
+{-# INLINABLE rdoubleLeft #-}
 rdoubleLeft
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
@@ -616,6 +631,7 @@
     rsingleLeft k1 p1 v1 t1 m1 (rsingleRight k2 p2 v2 t2 m2 t3)
 rdoubleLeft _ _ _ _ _ _ = moduleError "rdoubleLeft" "malformed tree"
 
+{-# INLINABLE rdoubleRight #-}
 rdoubleRight
     :: (Ord k, Ord p)
     => k -> p -> v -> LTree k p v -> k -> LTree k p v -> LTree k p v
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/psqueues-0.2.7.3/tests/Data/PSQ/Class/Tests.hs 
new/psqueues-0.2.8.0/tests/Data/PSQ/Class/Tests.hs
--- old/psqueues-0.2.7.3/tests/Data/PSQ/Class/Tests.hs  2021-11-05 
18:30:31.000000000 +0100
+++ new/psqueues-0.2.8.0/tests/Data/PSQ/Class/Tests.hs  2023-10-27 
17:45:24.000000000 +0200
@@ -178,9 +178,12 @@
     :: forall psq. (PSQ psq, TestKey (Key psq),
                     Eq (psq Int Char), Show (psq Int Char))
     => Tagged psq Assertion
-test_fromList = Tagged $
+test_fromList = Tagged $ do
     let ls = [(1, 0, 'A'), (2, 0, 'B'), (3, 0, 'C'), (4, 0, 'D')]
-    in (fromList ls :: psq Int Char) @?= fromList (reverse ls)
+      in (fromList ls :: psq Int Char) @?= fromList (reverse ls)
+    let qs = [(4, 0, 'D'), (1, 5, 'Q'), (2, 0, 'B'), (1, 0, 'A'), (3, 0, 'C'), 
(2, 5, 'Z')]
+        qs' = [(1, 0, 'A'), (2, 5, 'Z'), (3, 0, 'C'), (4, 0, 'D')]
+      in List.sort (toList (fromList qs :: psq Int Char)) @?= qs'
 
 test_foldr
     :: forall psq. (PSQ psq, TestKey (Key psq),

Reply via email to