Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package ghc-vector-algorithms for
openSUSE:Factory checked in at 2023-04-04 21:24:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-vector-algorithms (Old)
and /work/SRC/openSUSE:Factory/.ghc-vector-algorithms.new.19717 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-vector-algorithms"
Tue Apr 4 21:24:30 2023 rev:17 rq:1076111 version:0.9.0.1
Changes:
--------
---
/work/SRC/openSUSE:Factory/ghc-vector-algorithms/ghc-vector-algorithms.changes
2022-08-01 21:31:24.597830495 +0200
+++
/work/SRC/openSUSE:Factory/.ghc-vector-algorithms.new.19717/ghc-vector-algorithms.changes
2023-04-04 21:24:50.946701708 +0200
@@ -1,0 +2,24 @@
+Thu Mar 30 17:08:54 UTC 2023 - Peter Simons <[email protected]>
+
+- Updated spec file to conform with ghc-rpm-macros-2.5.2.
+
+-------------------------------------------------------------------
+Fri Mar 10 18:43:32 UTC 2023 - Peter Simons <[email protected]>
+
+- Update vector-algorithms to version 0.9.0.1 revision 2.
+ Upstream has revised the Cabal build instructions on Hackage.
+
+-------------------------------------------------------------------
+Sat Oct 8 21:29:29 UTC 2022 - Peter Simons <[email protected]>
+
+- Update vector-algorithms to version 0.9.0.1 revision 1.
+ ## Version 0.9.0.1 (2022-07-28)
+
+ - Allow building with vector-0.13.*.
+
+ ## Version 0.9.0.0 (2022-05-19)
+
+ - Add nub related functions.
+ - Add sortUniq related functions (sorts, then removes duplicates).
+
+-------------------------------------------------------------------
Old:
----
vector-algorithms-0.8.0.4.tar.gz
New:
----
vector-algorithms-0.9.0.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ ghc-vector-algorithms.spec ++++++
--- /var/tmp/diff_new_pack.BLClen/_old 2023-04-04 21:24:51.790706487 +0200
+++ /var/tmp/diff_new_pack.BLClen/_new 2023-04-04 21:24:51.798706532 +0200
@@ -1,7 +1,7 @@
#
# spec file for package ghc-vector-algorithms
#
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -17,9 +17,10 @@
%global pkg_name vector-algorithms
+%global pkgver %{pkg_name}-%{version}
%bcond_with tests
Name: ghc-%{pkg_name}
-Version: 0.8.0.4
+Version: 0.9.0.1
Release: 0
Summary: Efficient algorithms for vector arrays
License: BSD-3-Clause
@@ -27,14 +28,23 @@
Source0:
https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz
Source1:
https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal#/%{pkg_name}.cabal
BuildRequires: ghc-Cabal-devel
+BuildRequires: ghc-base-devel
+BuildRequires: ghc-base-prof
+BuildRequires: ghc-bitvec-devel
+BuildRequires: ghc-bitvec-prof
BuildRequires: ghc-bytestring-devel
+BuildRequires: ghc-bytestring-prof
BuildRequires: ghc-primitive-devel
+BuildRequires: ghc-primitive-prof
BuildRequires: ghc-rpm-macros
BuildRequires: ghc-vector-devel
+BuildRequires: ghc-vector-prof
ExcludeArch: %{ix86}
%if %{with tests}
BuildRequires: ghc-QuickCheck-devel
+BuildRequires: ghc-QuickCheck-prof
BuildRequires: ghc-containers-devel
+BuildRequires: ghc-containers-prof
%endif
%description
@@ -52,6 +62,22 @@
This package provides the Haskell %{pkg_name} library development
files.
+%package -n ghc-%{pkg_name}-doc
+Summary: Haskell %{pkg_name} library documentation
+Requires: ghc-filesystem
+BuildArch: noarch
+
+%description -n ghc-%{pkg_name}-doc
+This package provides the Haskell %{pkg_name} library documentation.
+
+%package -n ghc-%{pkg_name}-prof
+Summary: Haskell %{pkg_name} profiling library
+Requires: ghc-%{pkg_name}-devel = %{version}-%{release}
+Supplements: (ghc-%{pkg_name}-devel and ghc-prof)
+
+%description -n ghc-%{pkg_name}-prof
+This package provides the Haskell %{pkg_name} profiling library.
+
%prep
%autosetup -n %{pkg_name}-%{version}
cp -p %{SOURCE1} %{pkg_name}.cabal
@@ -77,4 +103,9 @@
%files devel -f %{name}-devel.files
%doc CHANGELOG.md
+%files -n ghc-%{pkg_name}-doc -f ghc-%{pkg_name}-doc.files
+%license LICENSE
+
+%files -n ghc-%{pkg_name}-prof -f ghc-%{pkg_name}-prof.files
+
%changelog
++++++ vector-algorithms-0.8.0.4.tar.gz -> vector-algorithms-0.9.0.1.tar.gz
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/vector-algorithms-0.8.0.4/CHANGELOG.md
new/vector-algorithms-0.9.0.1/CHANGELOG.md
--- old/vector-algorithms-0.8.0.4/CHANGELOG.md 2001-09-09 03:46:40.000000000
+0200
+++ new/vector-algorithms-0.9.0.1/CHANGELOG.md 2001-09-09 03:46:40.000000000
+0200
@@ -1,3 +1,12 @@
+## Version 0.9.0.1 (2022-07-28)
+
+- Allow building with vector-0.13.*.
+
+## Version 0.9.0.0 (2022-05-19)
+
+- Add nub related functions.
+- Add sortUniq related functions (sorts, then removes duplicates).
+
## Version 0.8.0.4 (2020-12-06)
- Fix out of range access in Intro.partialSort.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/vector-algorithms-0.8.0.4/LICENSE
new/vector-algorithms-0.9.0.1/LICENSE
--- old/vector-algorithms-0.8.0.4/LICENSE 2001-09-09 03:46:40.000000000
+0200
+++ new/vector-algorithms-0.9.0.1/LICENSE 2001-09-09 03:46:40.000000000
+0200
@@ -33,7 +33,7 @@
------------------------------------------------------------------------------
The code in Data.Array.Vector.Algorithms.Mutable.Optimal is adapted from a C
-algorithm for the same purpose. The folowing is the copyright notice for said
+algorithm for the same purpose. The following is the copyright notice for said
C code:
Copyright (c) 2004 Paul Hsieh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/vector-algorithms-0.8.0.4/bench/simple/Main.hs
new/vector-algorithms-0.9.0.1/bench/simple/Main.hs
--- old/vector-algorithms-0.8.0.4/bench/simple/Main.hs 2001-09-09
03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/bench/simple/Main.hs 2001-09-09
03:46:40.000000000 +0200
@@ -12,7 +12,8 @@
import Data.Ord (comparing)
import Data.List (maximumBy)
-import Data.Vector.Unboxed.Mutable
+import qualified Data.Vector.Unboxed.Mutable as UVector
+import Data.Vector.Unboxed.Mutable (MVector, Unbox)
import qualified Data.Vector.Algorithms.Insertion as INS
import qualified Data.Vector.Algorithms.Intro as INT
@@ -35,8 +36,8 @@
-- Allocates a temporary buffer, like mergesort for similar purposes as noalgo.
alloc :: (Unbox e) => MVector RealWorld e -> IO ()
alloc arr | len <= 4 = arr `seq` return ()
- | otherwise = (new (len `div` 2) :: IO (MVector RealWorld Int)) >>
return ()
- where len = length arr
+ | otherwise = (UVector.new (len `div` 2) :: IO (MVector RealWorld
Int)) >> return ()
+ where len = UVector.length arr
displayTime :: String -> Integer -> IO ()
displayTime s elapsed = putStrLn $
@@ -47,7 +48,7 @@
sortSuite :: String -> GenIO -> Int -> (MVector RealWorld Int -> IO ()) -> IO
()
sortSuite str g n sort = do
- arr <- new n
+ arr <- UVector.new n
putStrLn $ "Testing: " ++ str
run "Random " $ speedTest arr n (rand g >=> modulo n) sort
run "Sorted " $ speedTest arr n ascend sort
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/AmericanFlag.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/AmericanFlag.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/AmericanFlag.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/AmericanFlag.hs
2001-09-09 03:46:40.000000000 +0200
@@ -27,7 +27,9 @@
-- rather than running for a set number of iterations.
module Data.Vector.Algorithms.AmericanFlag ( sort
+ , sortUniq
, sortBy
+ , sortUniqBy
, terminate
, Lexicographic(..)
) where
@@ -244,6 +246,14 @@
p = Proxy
{-# INLINABLE sort #-}
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: forall e m v. (PrimMonad m, MVector v e, Lexicographic e, Ord e)
+ => v (PrimState m) e -> m (v (PrimState m) e)
+sortUniq v = sortUniqBy compare terminate (size p) index v
+ where p :: Proxy e
+ p = Proxy
+{-# INLINABLE sortUniq #-}
+
-- | A fully parameterized version of the sorting algorithm. Again, this
-- function takes both radix information and a comparison, because the
-- algorithms falls back to insertion sort for small arrays.
@@ -262,6 +272,23 @@
flagLoop cmp stop radix count pile v
{-# INLINE sortBy #-}
+-- | A variant on `sortBy` which returns a vector of unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e)
+ => Comparison e -- ^ a comparison for the insertion sort flalback
+ -> (e -> Int -> Bool) -- ^ determines whether a stripe is complete
+ -> Int -- ^ the number of buckets necessary
+ -> (Int -> e -> Int) -- ^ the big-endian radix function
+ -> v (PrimState m) e -- ^ the array to be sorted
+ -> m (v (PrimState m) e)
+sortUniqBy cmp stop buckets radix v
+ | length v == 0 = return v
+ | otherwise = do count <- new buckets
+ pile <- new buckets
+ countLoop (radix 0) v count
+ flagLoop cmp stop radix count pile v
+ uniqueMutableBy cmp v
+{-# INLINE sortUniqBy #-}
+
flagLoop :: (PrimMonad m, MVector v e)
=> Comparison e
-> (e -> Int -> Bool) -- number of passes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Common.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Common.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Common.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Common.hs
2001-09-09 03:46:40.000000000 +0200
@@ -1,5 +1,7 @@
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE ScopedTypeVariables #-}
-- ---------------------------------------------------------------------------
-- |
@@ -11,7 +13,15 @@
--
-- Common operations and utility functions for all sorts
-module Data.Vector.Algorithms.Common where
+module Data.Vector.Algorithms.Common
+ ( type Comparison
+ , copyOffset
+ , inc
+ , countLoop
+ , midPoint
+ , uniqueMutableBy
+ )
+ where
import Prelude hiding (read, length)
@@ -57,3 +67,66 @@
toInt :: Word -> Int
toInt = fromIntegral
{-# INLINE midPoint #-}
+
+-- Adapted from Andrew Martin's uniquqMutable in the primitive-sort package
+uniqueMutableBy :: forall m v a . (PrimMonad m, MVector v a)
+ => Comparison a -> v (PrimState m) a -> m (v (PrimState m) a)
+uniqueMutableBy cmp mv = do
+ let !len = basicLength mv
+ if len > 1
+ then do
+ !a0 <- unsafeRead mv 0
+ let findFirstDuplicate :: a -> Int -> m Int
+ findFirstDuplicate !prev !ix = if ix < len
+ then do
+ a <- unsafeRead mv ix
+ if cmp a prev == EQ
+ then return ix
+ else findFirstDuplicate a (ix + 1)
+ else return ix
+ dupIx <- findFirstDuplicate a0 1
+ if dupIx == len
+ then return mv
+ else do
+ let deduplicate :: a -> Int -> Int -> m Int
+ deduplicate !prev !srcIx !dstIx = if srcIx < len
+ then do
+ a <- unsafeRead mv srcIx
+ if cmp a prev == EQ
+ then deduplicate a (srcIx + 1) dstIx
+ else do
+ unsafeWrite mv dstIx a
+ deduplicate a (srcIx + 1) (dstIx + 1)
+ else return dstIx
+ !a <- unsafeRead mv dupIx
+ !reducedLen <- deduplicate a (dupIx + 1) dupIx
+ resizeVector mv reducedLen
+ else return mv
+{-# INLINABLE uniqueMutableBy #-}
+
+-- Used internally in uniqueMutableBy: copies the elements of a vector to one
+-- of a smaller size.
+resizeVector
+ :: (MVector v a, PrimMonad m)
+ => v (PrimState m) a -> Int -> m (v (PrimState m) a)
+resizeVector !src !sz = do
+ dst <- unsafeNew sz
+ copyToSmaller dst src
+ pure dst
+{-# inline resizeVector #-}
+
+-- Used internally in resizeVector: copy a vector from a larger to
+-- smaller vector. Should not be used if the source vector
+-- is smaller than the target vector.
+copyToSmaller
+ :: (MVector v a, PrimMonad m)
+ => v (PrimState m) a -> v (PrimState m) a -> m ()
+copyToSmaller !dst !src = stToPrim $ do_copy 0
+ where
+ !n = basicLength dst
+
+ do_copy i | i < n = do
+ x <- basicUnsafeRead src i
+ basicUnsafeWrite dst i x
+ do_copy (i+1)
+ | otherwise = return ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Heap.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Heap.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Heap.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Heap.hs
2001-09-09 03:46:40.000000000 +0200
@@ -19,7 +19,9 @@
module Data.Vector.Algorithms.Heap
( -- * Sorting
sort
+ , sortUniq
, sortBy
+ , sortUniqBy
, sortByBounds
-- * Selection
, select
@@ -47,7 +49,7 @@
import Data.Vector.Generic.Mutable
-import Data.Vector.Algorithms.Common (Comparison)
+import Data.Vector.Algorithms.Common (Comparison, uniqueMutableBy)
import qualified Data.Vector.Algorithms.Optimal as O
@@ -56,11 +58,24 @@
sort = sortBy compare
{-# INLINABLE sort #-}
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m (v
(PrimState m) e)
+sortUniq = sortUniqBy compare
+{-# INLINABLE sortUniq #-}
+
-- | Sorts an entire array using a custom ordering.
sortBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e -> m
()
sortBy cmp a = sortByBounds cmp a 0 (length a)
{-# INLINE sortBy #-}
+-- | A variant on `sortBy` which returns a vector of unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e)
+ => Comparison e -> v (PrimState m) e -> m (v (PrimState m) e)
+sortUniqBy cmp a = do
+ sortByBounds cmp a 0 (length a)
+ uniqueMutableBy cmp a
+{-# INLINE sortUniqBy #-}
+
-- | Sorts a portion of an array [l,u) using a custom ordering
sortByBounds
:: (PrimMonad m, MVector v e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Insertion.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Insertion.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Insertion.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Insertion.hs
2001-09-09 03:46:40.000000000 +0200
@@ -14,7 +14,9 @@
module Data.Vector.Algorithms.Insertion
( sort
+ , sortUniq
, sortBy
+ , sortUniqBy
, sortByBounds
, sortByBounds'
, Comparison
@@ -27,7 +29,7 @@
import Data.Vector.Generic.Mutable
-import Data.Vector.Algorithms.Common (Comparison)
+import Data.Vector.Algorithms.Common (Comparison, uniqueMutableBy)
import qualified Data.Vector.Algorithms.Optimal as O
@@ -36,11 +38,23 @@
sort = sortBy compare
{-# INLINABLE sort #-}
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m (v
(PrimState m) e)
+sortUniq = sortUniqBy compare
+{-# INLINABLE sortUniq #-}
+
-- | Sorts an entire array using a given comparison
sortBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e -> m
()
sortBy cmp a = sortByBounds cmp a 0 (length a)
{-# INLINE sortBy #-}
+-- | A variant on `sortBy` which returns a vector of unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e
-> m (v (PrimState m) e)
+sortUniqBy cmp a = do
+ sortByBounds cmp a 0 (length a)
+ uniqueMutableBy cmp a
+{-# INLINE sortUniqBy #-}
+
-- | Sorts the portion of an array delimited by [l,u)
sortByBounds :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> Int -> Int -> m ()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Intro.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Intro.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Intro.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Intro.hs
2001-09-09 03:46:40.000000000 +0200
@@ -35,7 +35,9 @@
module Data.Vector.Algorithms.Intro
( -- * Sorting
sort
+ , sortUniq
, sortBy
+ , sortUniqBy
, sortByBounds
-- * Selecting
, select
@@ -56,7 +58,7 @@
import Data.Bits
import Data.Vector.Generic.Mutable
-import Data.Vector.Algorithms.Common (Comparison, midPoint)
+import Data.Vector.Algorithms.Common (Comparison, midPoint, uniqueMutableBy)
import qualified Data.Vector.Algorithms.Insertion as I
import qualified Data.Vector.Algorithms.Optimal as O
@@ -67,11 +69,24 @@
sort = sortBy compare
{-# INLINABLE sort #-}
--- | Sorts an entire array using a custom ordering.
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m (v
(PrimState m) e)
+sortUniq = sortUniqBy compare
+{-# INLINABLE sortUniq #-}
+
+-- | A variant on `sortBy` which returns a vector of unique elements.
sortBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e -> m
()
sortBy cmp a = sortByBounds cmp a 0 (length a)
{-# INLINE sortBy #-}
+-- | Sorts an entire array using a custom ordering returning a vector of
+-- the unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e
-> m (v (PrimState m) e)
+sortUniqBy cmp a = do
+ sortByBounds cmp a 0 (length a)
+ uniqueMutableBy cmp a
+{-# INLINE sortUniqBy #-}
+
-- | Sorts a portion of an array [l,u) using a custom ordering
sortByBounds
:: (PrimMonad m, MVector v e)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Merge.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Merge.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Merge.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Merge.hs
2001-09-09 03:46:40.000000000 +0200
@@ -16,7 +16,9 @@
module Data.Vector.Algorithms.Merge
( sort
+ , sortUniq
, sortBy
+ , sortUniqBy
, Comparison
) where
@@ -27,7 +29,7 @@
import Data.Bits
import Data.Vector.Generic.Mutable
-import Data.Vector.Algorithms.Common (Comparison, copyOffset, midPoint)
+import Data.Vector.Algorithms.Common (Comparison, copyOffset, midPoint,
uniqueMutableBy)
import qualified Data.Vector.Algorithms.Optimal as O
import qualified Data.Vector.Algorithms.Insertion as I
@@ -37,6 +39,11 @@
sort = sortBy compare
{-# INLINABLE sort #-}
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m (v
(PrimState m) e)
+sortUniq = sortUniqBy compare
+{-# INLINABLE sortUniq #-}
+
-- | Sorts an array using a custom comparison.
sortBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e -> m
()
sortBy cmp vec = if len <= 4
@@ -57,6 +64,13 @@
halfLen = (len + 1) `div` 2
{-# INLINE sortBy #-}
+-- | A variant on `sortBy` which returns a vector of unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e) => Comparison e -> v (PrimState m) e
-> m (v (PrimState m) e)
+sortUniqBy cmp vec = do
+ sortBy cmp vec
+ uniqueMutableBy cmp vec
+{-# INLINE sortUniqBy #-}
+
mergeSortWithBuf :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> v (PrimState m) e ->
m ()
mergeSortWithBuf cmp src buf = loop 0 (length src)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Optimal.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Optimal.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Optimal.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Optimal.hs
2001-09-09 03:46:40.000000000 +0200
@@ -40,6 +40,13 @@
import Data.Vector.Algorithms.Common (Comparison)
+#if MIN_VERSION_vector(0,13,0)
+import qualified Data.Vector.Internal.Check as Ck
+# define CHECK_INDEX(name, i, n) Ck.checkIndex Ck.Unsafe (i) (n)
+#else
+# define CHECK_INDEX(name, i, n) UNSAFE_CHECK(checkIndex) name (i) (n)
+#endif
+
#include "vector.h"
-- | Sorts the elements at the positions 'off' and 'off + 1' in the given
@@ -54,8 +61,8 @@
-- be the 'lower' of the two.
sort2ByIndex :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> Int -> Int -> m ()
-sort2ByIndex cmp a i j = UNSAFE_CHECK(checkIndex) "sort2ByIndex" i (length a)
- $ UNSAFE_CHECK(checkIndex) "sort2ByIndex" j (length a)
$ do
+sort2ByIndex cmp a i j = CHECK_INDEX("sort2ByIndex", i, length a)
+ $ CHECK_INDEX("sort2ByIndex", j, length a) $ do
a0 <- unsafeRead a i
a1 <- unsafeRead a j
case cmp a0 a1 of
@@ -75,9 +82,9 @@
-- lowest position in the array.
sort3ByIndex :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> Int -> Int -> Int -> m ()
-sort3ByIndex cmp a i j k = UNSAFE_CHECK(checkIndex) "sort3ByIndex" i (length a)
- $ UNSAFE_CHECK(checkIndex) "sort3ByIndex" j (length a)
- $ UNSAFE_CHECK(checkIndex) "sort3ByIndex" k (length
a) $ do
+sort3ByIndex cmp a i j k = CHECK_INDEX("sort3ByIndex", i, length a)
+ $ CHECK_INDEX("sort3ByIndex", j, length a)
+ $ CHECK_INDEX("sort3ByIndex", k, length a) $ do
a0 <- unsafeRead a i
a1 <- unsafeRead a j
a2 <- unsafeRead a k
@@ -114,10 +121,10 @@
-- it can be used to sort medians into particular positions and so on.
sort4ByIndex :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> Int -> Int -> Int -> Int
-> m ()
-sort4ByIndex cmp a i j k l = UNSAFE_CHECK(checkIndex) "sort4ByIndex" i (length
a)
- $ UNSAFE_CHECK(checkIndex) "sort4ByIndex" j (length
a)
- $ UNSAFE_CHECK(checkIndex) "sort4ByIndex" k (length
a)
- $ UNSAFE_CHECK(checkIndex) "sort4ByIndex" l (length
a) $ do
+sort4ByIndex cmp a i j k l = CHECK_INDEX("sort4ByIndex", i, length a)
+ $ CHECK_INDEX("sort4ByIndex", j, length a)
+ $ CHECK_INDEX("sort4ByIndex", k, length a)
+ $ CHECK_INDEX("sort4ByIndex", l, length a) $ do
a0 <- unsafeRead a i
a1 <- unsafeRead a j
a2 <- unsafeRead a k
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Search.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Search.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Search.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Search.hs
2001-09-09 03:46:40.000000000 +0200
@@ -119,7 +119,7 @@
where p e' = case cmp e' e of GT -> True ; _ -> False
{-# INLINE binarySearchRByBounds #-}
--- | Given a predicate that is guaraneteed to be monotone on the given vector,
+-- | Given a predicate that is guaranteed to be monotone on the given vector,
-- finds the first index at which the predicate returns True, or the length of
-- the array if the predicate is false for the entire array.
binarySearchP :: (PrimMonad m, MVector v e) => (e -> Bool) -> v (PrimState m)
e -> m Int
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Tim.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Tim.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms/Tim.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms/Tim.hs
2001-09-09 03:46:40.000000000 +0200
@@ -91,7 +91,9 @@
module Data.Vector.Algorithms.Tim
( sort
+ , sortUniq
, sortBy
+ , sortUniqBy
) where
import Prelude hiding (length, reverse)
@@ -106,12 +108,18 @@
, gallopingSearchLeftPBounds
)
import Data.Vector.Algorithms.Insertion (sortByBounds', Comparison)
+import Data.Vector.Algorithms.Common (uniqueMutableBy)
-- | Sorts an array using the default comparison.
sort :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m ()
sort = sortBy compare
{-# INLINABLE sort #-}
+-- | A variant on `sort` that returns a vector of unique elements.
+sortUniq :: (PrimMonad m, MVector v e, Ord e) => v (PrimState m) e -> m (v
(PrimState m) e)
+sortUniq = sortUniqBy compare
+{-# INLINABLE sortUniq #-}
+
-- | Sorts an array using a custom comparison.
sortBy :: (PrimMonad m, MVector v e)
=> Comparison e -> v (PrimState m) e -> m ()
@@ -146,6 +154,14 @@
performRemainingMerges _ _ = return ()
{-# INLINE sortBy #-}
+-- | A variant on `sortBy` which returns a vector of unique elements.
+sortUniqBy :: (PrimMonad m, MVector v e)
+ => Comparison e -> v (PrimState m) e -> m (v (PrimState m) e)
+sortUniqBy cmp vec = do
+ sortBy cmp vec
+ uniqueMutableBy cmp vec
+{-# INLINE sortUniqBy #-}
+
-- | Computes the minimum run size for the sort. The goal is to choose a size
-- such that there are almost if not exactly 2^n chunks of that size in the
-- array.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms.hs
new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms.hs
--- old/vector-algorithms-0.8.0.4/src/Data/Vector/Algorithms.hs 1970-01-01
01:00:00.000000000 +0100
+++ new/vector-algorithms-0.9.0.1/src/Data/Vector/Algorithms.hs 2001-09-09
03:46:40.000000000 +0200
@@ -0,0 +1,74 @@
+{-# language BangPatterns, RankNTypes, ScopedTypeVariables #-}
+module Data.Vector.Algorithms where
+
+import Prelude hiding (length)
+import Control.Monad
+import Control.Monad.Primitive
+import Control.Monad.ST (runST)
+
+import Data.Vector.Generic.Mutable
+import qualified Data.Vector.Generic as V
+import qualified Data.Vector.Unboxed.Mutable as UMV
+import qualified Data.Bit as Bit
+
+import Data.Vector.Algorithms.Common (Comparison)
+import Data.Vector.Algorithms.Intro (sortUniqBy)
+import qualified Data.Vector.Algorithms.Search as S
+
+-- | The `nub` function which removes duplicate elements from a vector.
+nub :: forall v e . (V.Vector v e, Ord e) => v e -> v e
+nub = nubBy compare
+
+-- | A version of `nub` with a custom comparison predicate.
+--
+-- /Note:/ This function makes use of `sortByUniq` using the intro
+-- sort algorithm.
+nubBy ::
+ forall v e . (V.Vector v e) =>
+ Comparison e -> v e -> v e
+nubBy cmp vec = runST $ do
+ mv <- V.unsafeThaw vec -- safe as the nubByMut algorithm copies the input
+ destMV <- nubByMut sortUniqBy cmp mv
+ v <- V.unsafeFreeze destMV
+ pure (V.force v)
+
+-- | The `nubByMut` function takes in an in-place sort algorithm
+-- and uses it to do a de-deduplicated sort. It then uses this to
+-- remove duplicate elements from the input.
+--
+-- /Note:/ Since this algorithm needs the original input and so
+-- copies before sorting in-place. As such, it is safe to use on
+-- immutable inputs.
+nubByMut ::
+ forall m v e . (PrimMonad m, MVector v e) =>
+ (Comparison e -> v (PrimState m) e -> m (v (PrimState m) e))
+ -> Comparison e -> v (PrimState m) e -> m (v (PrimState m) e)
+nubByMut alg cmp inp = do
+ let len = length inp
+ inp' <- clone inp
+ sortUniqs <- alg cmp inp'
+ let uniqLen = length sortUniqs
+ bitmask <- UMV.replicate uniqLen (Bit.Bit False) -- bitmask to track which
elements have
+ -- already been seen.
+ dest :: v (PrimState m) e <- unsafeNew uniqLen -- return vector
+ let
+ go :: Int -> Int -> m ()
+ go !srcInd !destInd
+ | srcInd == len = pure ()
+ | destInd == uniqLen = pure ()
+ | otherwise = do
+ curr <- unsafeRead inp srcInd -- read current
element
+ sortInd <- S.binarySearchBy cmp sortUniqs curr -- find sorted index
+ bit <- UMV.unsafeRead bitmask sortInd -- check if we have
already seen
+ -- this element in
bitvector
+ case bit of
+ -- if we have seen it then iterate
+ Bit.Bit True -> go (srcInd + 1) destInd
+ -- if we haven't then write it into output
+ -- and mark that it has been seen
+ Bit.Bit False -> do
+ UMV.unsafeWrite bitmask sortInd (Bit.Bit True)
+ unsafeWrite dest destInd curr
+ go (srcInd + 1) (destInd + 1)
+ go 0 0
+ pure dest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/tests/properties/Optimal.hs
new/vector-algorithms-0.9.0.1/tests/properties/Optimal.hs
--- old/vector-algorithms-0.8.0.4/tests/properties/Optimal.hs 2001-09-09
03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/tests/properties/Optimal.hs 2001-09-09
03:46:40.000000000 +0200
@@ -8,7 +8,7 @@
import Control.Arrow
import Control.Monad
-import Data.List
+import qualified Data.List as List
import Data.Function
import Data.Vector.Generic hiding (map, zip, concatMap, (++), replicate, foldM)
@@ -32,18 +32,18 @@
stability :: (Vector v (Int,Int)) => Int -> [v (Int, Int)]
stability n = concatMap ( map fromList
. foldM interleavings []
- . groupBy ((==) `on` fst)
+ . List.groupBy ((==) `on` fst)
. flip zip [0..])
$ monotones (n-2) n
sort2 :: (Vector v Int) => [v Int]
-sort2 = map fromList $ permutations [0,1]
+sort2 = map fromList $ List.permutations [0,1]
stability2 :: (Vector v (Int,Int)) => [v (Int, Int)]
stability2 = [fromList [(0, 0), (0, 1)]]
sort3 :: (Vector v Int) => [v Int]
-sort3 = map fromList $ permutations [0..2]
+sort3 = map fromList $ List.permutations [0..2]
{-
stability3 :: [UArr (Int :*: Int)]
@@ -58,5 +58,5 @@
-}
sort4 :: (Vector v Int) => [v Int]
-sort4 = map fromList $ permutations [0..3]
+sort4 = map fromList $ List.permutations [0..3]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/vector-algorithms-0.8.0.4/tests/properties/Properties.hs
new/vector-algorithms-0.9.0.1/tests/properties/Properties.hs
--- old/vector-algorithms-0.8.0.4/tests/properties/Properties.hs
2001-09-09 03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/tests/properties/Properties.hs
2001-09-09 03:46:40.000000000 +0200
@@ -1,4 +1,4 @@
-{-# LANGUAGE RankNTypes, FlexibleContexts #-}
+{-# LANGUAGE RankNTypes, FlexibleContexts, GADTs #-}
module Properties where
@@ -21,9 +21,11 @@
import Data.Vector.Generic (modify)
import qualified Data.Vector.Generic.Mutable as G
+import qualified Data.Vector.Generic as GV
import Data.Vector.Algorithms.Optimal (Comparison)
import Data.Vector.Algorithms.Radix (radix, passes, size)
+import qualified Data.Vector.Algorithms as Alg
import qualified Data.Map as M
@@ -38,6 +40,13 @@
check e arr | V.null arr = property True
| otherwise = e <= V.head arr .&. check (V.head arr) (V.tail arr)
+prop_sorted_uniq :: (Ord e) => Vector e -> Property
+prop_sorted_uniq arr | V.length arr < 2 = property True
+ | otherwise = check (V.head arr) (V.tail arr)
+ where
+ check e arr | V.null arr = property True
+ | otherwise = e < V.head arr .&. check (V.head arr) (V.tail arr)
+
prop_empty :: (Ord e) => (forall s. MV.MVector s e -> ST s ()) -> Property
prop_empty algo = prop_sorted (modify algo $ V.fromList [])
@@ -45,6 +54,23 @@
=> (forall s mv. G.MVector mv e => mv s e -> ST s ()) -> Vector
e -> Property
prop_fullsort algo arr = prop_sorted $ modify algo arr
+runFreeze
+ :: forall e . (Ord e)
+ => (forall s mv . G.MVector mv e => mv s e -> ST s (mv s e))
+ -> (forall s v mv. (GV.Vector v e, mv ~ GV.Mutable v) => mv s e -> ST s (v
e))
+runFreeze alg mv = do
+ mv <- alg mv
+ GV.unsafeFreeze mv
+
+prop_full_sortUniq
+ :: (Ord e, Show e)
+ => (forall s . MV.MVector s e -> ST s (Vector e))
+ -> Vector e -> Property
+prop_full_sortUniq algo arr = runST $ do
+ mv <- V.unsafeThaw arr
+ arr' <- algo mv
+ pure (prop_sorted_uniq arr')
+
{-
prop_schwartzian :: (UA e, UA k, Ord k)
=> (e -> k)
@@ -183,3 +209,7 @@
=> (forall s. MVector s e -> e -> ST s Int)
-> SortedVec e -> e -> Property
prop_search_upbound = prop_search_insert (<=) (>)
+
+prop_nub :: (Ord e, Show e) => Vector e -> Property
+prop_nub v =
+ V.fromList (nub (V.toList v)) === Alg.nub v
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/vector-algorithms-0.8.0.4/tests/properties/Tests.hs
new/vector-algorithms-0.9.0.1/tests/properties/Tests.hs
--- old/vector-algorithms-0.8.0.4/tests/properties/Tests.hs 2001-09-09
03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/tests/properties/Tests.hs 2001-09-09
03:46:40.000000000 +0200
@@ -1,4 +1,4 @@
-{-# LANGUAGE RankNTypes, TypeOperators, FlexibleContexts #-}
+{-# LANGUAGE RankNTypes, TypeOperators, FlexibleContexts, TypeApplications #-}
module Main (main) where
@@ -18,7 +18,9 @@
import Data.Vector (Vector)
import qualified Data.Vector as V
+import qualified Data.Vector.Mutable as BoxedMV
+import qualified Data.Vector.Generic as G
import Data.Vector.Generic.Mutable (MVector)
import qualified Data.Vector.Generic.Mutable as MV
@@ -36,10 +38,12 @@
type Algo e r = forall s mv. MVector mv e => mv s e -> ST s r
type SizeAlgo e r = forall s mv. MVector mv e => mv s e -> Int -> ST s r
type BoundAlgo e r = forall s mv. MVector mv e => mv s e -> Int -> Int -> ST s
r
+type MonoAlgo e r = forall s . BoxedMV.MVector s e -> ST s r
newtype WrappedAlgo e r = WrapAlgo { unWrapAlgo :: Algo e
r }
newtype WrappedSizeAlgo e r = WrapSizeAlgo { unWrapSizeAlgo :: SizeAlgo e
r }
newtype WrappedBoundAlgo e r = WrapBoundAlgo { unWrapBoundAlgo :: BoundAlgo e
r }
+newtype WrappedMonoAlgo e r = MonoAlgo { unWrapMonoAlgo :: MonoAlgo e
r }
args = stdArgs
{ maxSuccess = 1000
@@ -57,6 +61,17 @@
, ("timsort", WrapAlgo T.sort)
]
+check_Int_sortUniq = forM_ algos $ \(name,algo) ->
+ quickCheckWith args (label name . prop_full_sortUniq (unWrapMonoAlgo algo))
+ where
+ algos :: [(String, WrappedMonoAlgo Int (Vector Int))]
+ algos = [ ("intro_sortUniq", MonoAlgo (runFreeze INT.sortUniq))
+ , ("insertion sortUniq", MonoAlgo (runFreeze INS.sortUniq))
+ , ("merge sortUniq", MonoAlgo (runFreeze M.sortUniq))
+ , ("heap_sortUniq", MonoAlgo (runFreeze H.sortUniq))
+ , ("tim_sortUniq", MonoAlgo (runFreeze T.sortUniq))
+ ]
+
check_Int_partialsort = forM_ algos $ \(name,algo) ->
quickCheckWith args (label name . prop_partialsort (unWrapSizeAlgo algo))
where
@@ -73,6 +88,9 @@
, ("heap select", WrapSizeAlgo H.select)
]
+check_nub = quickCheckWith args (label "nub Int" . (prop_nub @Int))
+
+
check_radix_sorts = do
qc (label "radix Word8" . prop_fullsort (R.sort :: Algo Word8 ()))
qc (label "radix Word16" . prop_fullsort (R.sort :: Algo Word16 ()))
@@ -191,6 +209,7 @@
main = do putStrLn "Int tests:"
check_Int_sort
+ check_Int_sortUniq
check_Int_partialsort
check_Int_select
putStrLn "Radix sort tests:"
@@ -207,3 +226,5 @@
check_search_range
putStrLn "Corner cases:"
check_corners
+ putStrLn "Algorithms:"
+ check_nub
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/vector-algorithms-0.8.0.4/vector-algorithms.cabal
new/vector-algorithms-0.9.0.1/vector-algorithms.cabal
--- old/vector-algorithms-0.8.0.4/vector-algorithms.cabal 2001-09-09
03:46:40.000000000 +0200
+++ new/vector-algorithms-0.9.0.1/vector-algorithms.cabal 2001-09-09
03:46:40.000000000 +0200
@@ -1,5 +1,5 @@
name: vector-algorithms
-version: 0.8.0.4
+version: 0.9.0.1
license: BSD3
license-file: LICENSE
author: Dan Doel
@@ -57,7 +57,8 @@
default-language: Haskell2010
build-depends: base >= 4.5 && < 5,
- vector >= 0.6 && < 0.13,
+ bitvec >= 1.0 && < 1.2,
+ vector >= 0.6 && < 0.14,
primitive >=0.3 && <0.8,
bytestring >= 0.9 && < 1.0
@@ -65,6 +66,7 @@
build-depends: tagged >= 0.4 && < 0.9
exposed-modules:
+ Data.Vector.Algorithms
Data.Vector.Algorithms.Optimal
Data.Vector.Algorithms.Insertion
Data.Vector.Algorithms.Intro
++++++ vector-algorithms.cabal ++++++
--- /var/tmp/diff_new_pack.BLClen/_old 2023-04-04 21:24:51.938707325 +0200
+++ /var/tmp/diff_new_pack.BLClen/_new 2023-04-04 21:24:51.946707371 +0200
@@ -1,5 +1,5 @@
name: vector-algorithms
-version: 0.8.0.4
+version: 0.9.0.1
x-revision: 2
license: BSD3
license-file: LICENSE
@@ -58,14 +58,16 @@
default-language: Haskell2010
build-depends: base >= 4.5 && < 5,
- vector >= 0.6 && < 0.13,
- primitive >=0.3 && <0.8,
+ bitvec >= 1.0 && < 1.2,
+ vector >= 0.6 && < 0.14,
+ primitive >=0.6.2.0 && <0.9,
bytestring >= 0.9 && < 1.0
if ! impl (ghc >= 7.8)
build-depends: tagged >= 0.4 && < 0.9
exposed-modules:
+ Data.Vector.Algorithms
Data.Vector.Algorithms.Optimal
Data.Vector.Algorithms.Insertion
Data.Vector.Algorithms.Intro