From 21aed67f8b0e1597536f63c8bdf027f6d115b702 Mon Sep 17 00:00:00 2001 From: Daniel Casanueva Date: Wed, 28 May 2025 23:54:31 +0200 Subject: [PATCH 1/3] Add new function: chunks --- src/Data/Vector/Generic/Sized.hs | 11 +++++++++++ src/Data/Vector/Sized.hs | 7 +++++++ src/Data/Vector/Storable/Sized.hs | 7 +++++++ src/Data/Vector/Unboxed/Sized.hs | 7 +++++++ 4 files changed, 32 insertions(+) diff --git a/src/Data/Vector/Generic/Sized.hs b/src/Data/Vector/Generic/Sized.hs index 95d4011..57a9d95 100755 --- a/src/Data/Vector/Generic/Sized.hs +++ b/src/Data/Vector/Generic/Sized.hs @@ -60,6 +60,7 @@ module Data.Vector.Generic.Sized , drop' , splitAt , splitAt' + , chunks -- * Construction -- ** Initialization , empty @@ -628,6 +629,16 @@ splitAt' :: forall v n m a p. (KnownNat n, VG.Vector v a) splitAt' _ = splitAt {-# inline splitAt' #-} +-- | /O(n\/m)/ Split a vector into subvectors of equal length. +chunks :: forall v n m a. (KnownNat n, KnownNat m, VG.Vector v a, VG.Vector v (Vector v m a)) + => Vector v (n*m) a -> Vector v n (Vector v m a) +chunks (Vector v) = unfoldrN f v + where + m :: Int + m = fromIntegral (natVal (Proxy :: Proxy m)) + f = first Vector . VG.splitAt m +{-# inline chunks #-} + -------------------------------------------------------------------------------- -- * Construction -------------------------------------------------------------------------------- diff --git a/src/Data/Vector/Sized.hs b/src/Data/Vector/Sized.hs index 6b234d3..7e2bf3d 100644 --- a/src/Data/Vector/Sized.hs +++ b/src/Data/Vector/Sized.hs @@ -54,6 +54,7 @@ module Data.Vector.Sized , drop' , splitAt , splitAt' + , chunks -- * Construction -- ** Initialization , empty @@ -466,6 +467,12 @@ splitAt' :: forall n m a p. KnownNat n splitAt' = V.splitAt' {-# inline splitAt' #-} +-- | /O(n\/m)/ Split a vector into subvectors of equal length. +chunks :: forall n m a. (KnownNat n, KnownNat m) + => Vector (n*m) a -> Vector n (Vector m a) +chunks = V.chunks +{-# INLINE chunks #-} + -------------------------------------------------------------------------------- -- * Construction -------------------------------------------------------------------------------- diff --git a/src/Data/Vector/Storable/Sized.hs b/src/Data/Vector/Storable/Sized.hs index 9db3d3f..0f8b8af 100644 --- a/src/Data/Vector/Storable/Sized.hs +++ b/src/Data/Vector/Storable/Sized.hs @@ -55,6 +55,7 @@ module Data.Vector.Storable.Sized , drop' , splitAt , splitAt' + , chunks -- * Construction -- ** Initialization , empty @@ -471,6 +472,12 @@ splitAt' :: forall n m a p. (KnownNat n, Storable a) splitAt' = V.splitAt' {-# inline splitAt' #-} +-- | /O(n\/m)/ Split a vector into subvectors of equal length. +chunks :: forall n m a. (KnownNat n, KnownNat m, Storable a) + => Vector (n*m) a -> Vector n (Vector m a) +chunks = V.chunks +{-# inline chunks #-} + -------------------------------------------------------------------------------- -- * Construction -------------------------------------------------------------------------------- diff --git a/src/Data/Vector/Unboxed/Sized.hs b/src/Data/Vector/Unboxed/Sized.hs index c0ce7e5..513ac0a 100644 --- a/src/Data/Vector/Unboxed/Sized.hs +++ b/src/Data/Vector/Unboxed/Sized.hs @@ -55,6 +55,7 @@ module Data.Vector.Unboxed.Sized , drop' , splitAt , splitAt' + , chunks -- * Construction -- ** Initialization , empty @@ -472,6 +473,12 @@ splitAt' :: forall n m a p. (KnownNat n, Unbox a) splitAt' = V.splitAt' {-# inline splitAt' #-} +-- | /O(n\/m)/ Split a vector into subvectors of equal length. +chunks :: forall n m a. (KnownNat n, KnownNat m, Unbox a) + => Vector (n*m) a -> Vector n (Vector m a) +chunks = V.chunks +{-# inline chunks #-} + -------------------------------------------------------------------------------- -- * Construction -------------------------------------------------------------------------------- From 9eec15574d216363f3faf0daf0922ff85a633d84 Mon Sep 17 00:00:00 2001 From: Daniel Casanueva Date: Thu, 29 May 2025 00:00:28 +0200 Subject: [PATCH 2/3] Inline unfolding function --- src/Data/Vector/Generic/Sized.hs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Data/Vector/Generic/Sized.hs b/src/Data/Vector/Generic/Sized.hs index 57a9d95..1adb855 100755 --- a/src/Data/Vector/Generic/Sized.hs +++ b/src/Data/Vector/Generic/Sized.hs @@ -632,11 +632,10 @@ splitAt' _ = splitAt -- | /O(n\/m)/ Split a vector into subvectors of equal length. chunks :: forall v n m a. (KnownNat n, KnownNat m, VG.Vector v a, VG.Vector v (Vector v m a)) => Vector v (n*m) a -> Vector v n (Vector v m a) -chunks (Vector v) = unfoldrN f v +chunks (Vector v) = unfoldrN (first Vector . VG.splitAt m) v where m :: Int m = fromIntegral (natVal (Proxy :: Proxy m)) - f = first Vector . VG.splitAt m {-# inline chunks #-} -------------------------------------------------------------------------------- From 8c2a390e322ce2f4e157d8e189f2e304fc0e57fb Mon Sep 17 00:00:00 2001 From: Daniel Casanueva Date: Thu, 29 May 2025 00:09:49 +0200 Subject: [PATCH 3/3] WIP update --- changelog.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog.md b/changelog.md index 6befbc2..ec0143e 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,8 @@ ## WIP +- Add `chunks`. + ## [1.6.1] - Fix build against Stackage nightly for GHC 9.4.5