- 
                Notifications
    
You must be signed in to change notification settings  - Fork 26
 
Open
Description
Hello, it would be handy to have minIndexBy, minIndex, maxIndexBy, maxIndex. I adapted them from Data.Vector as follows:
   {-# INLINE minIndexBy #-}
    minIndexBy :: Massiv.Stream v Massiv.Ix1 a => (a -> a -> Ordering) -> Massiv.Vector v a -> Massiv.Ix1
    minIndexBy cmpr = fst . Massiv.sfoldl1' imin . Massiv.szip (Massiv.sfromList [0..])
      where
      imin (i,x) (j,y) = i `seq` j `seq` case cmpr x y of
        GT -> (j,y)
        _  -> (i,x)
    
    {-# INLINE minIndex #-}
    minIndex :: Ord a => Massiv.Stream v Massiv.Ix1 a => Massiv.Vector v a -> Massiv.Ix1
    minIndex = minIndexBy compare
    
    {-# INLINE maxIndexBy #-}
    maxIndexBy :: Massiv.Stream v Massiv.Ix1 a => (a -> a -> Ordering) -> Massiv.Vector v a -> Massiv.Ix1
    maxIndexBy cmpr = fst . Massiv.sfoldl1' imax . Massiv.szip (Massiv.sfromList [0..])
      where
      imax (i,x) (j,y) = i `seq` j `seq` case cmpr x y of
        LT -> (j,y)
        _  -> (i,x)
    
    {-# INLINE maxIndex #-}
    maxIndex :: Ord a => Massiv.Stream v Massiv.Ix1 a => Massiv.Vector v a -> Massiv.Ix1
    maxIndex = maxIndexBy compare
    
    {-
    minIndex $ ((Massiv.fromList Massiv.Seq ([4,3,2,1,0,1,2])) :: Massiv.Vector Massiv.P Massiv.Ix1) -- == 4
    [index]...................................0 1 2 3 4 5 6
    maxIndex $ ((Massiv.fromList Massiv.Seq ([4,3,2,1,9,1,2])) :: Massiv.Vector Massiv.P Massiv.Ix1) -- == 4
    -}
lehins, sheepforce, patrickaldis and gksato
Metadata
Metadata
Assignees
Labels
No labels