module Data.Repa.Array.Internals.Operator.Group
( groups
, groupsWith
, GroupsDict)
where
import Data.Repa.Array.Generic.Index as A
import Data.Repa.Array.Meta.Tuple as A
import Data.Repa.Array.Internals.Bulk as A
import Data.Repa.Array.Internals.Target as A
import Data.Repa.Fusion.Unpack as A
import Data.Repa.Eval.Chain as A
import qualified Data.Repa.Chain as C
#include "repa-array.h"
groups :: (GroupsDict lElt lGrp tGrp lLen tLen n, Eq n)
=> Name lGrp
-> Name lLen
-> Array lElt n
-> (Array (T2 lGrp lLen) (n, Int), Maybe (n, Int))
groups nGrp nLen arr
= groupsWith nGrp nLen (==) Nothing arr
groupsWith
:: GroupsDict lElt lGrp tGrp lLen tLen n
=> Name lGrp
-> Name lLen
-> (n -> n -> Bool)
-> Maybe (n, Int)
-> Array lElt n
-> (Array (T2 lGrp lLen) (n, Int), Maybe (n, Int))
groupsWith nGrp nLen f !c !vec0
= (vec1, snd k1)
where
f' x y = return $ f x y
(vec1, k1)
= A.unchainToArray (T2 nGrp nLen)
$ C.liftChain
$ C.groupsByC f' c
$ A.chainOfArray vec0
type GroupsDict lElt lGrp tGrp lLen tLen n
= ( Bulk lElt n
, Target lGrp n
, Target lLen Int
, Index lGrp ~ Index lLen
, Unpack (Buffer lLen Int) tLen
, Unpack (Buffer lGrp n) tGrp)