Skip to content

It would be handy to have minIndexBy, minIndex, maxIndexBy, maxIndex. #110

Open
@ilcasinistareloaded

Description

@ilcasinistareloaded

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
    -}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions