module ProjectM36.MiscUtils where

--returns duplicates of a pre-sorted list
dupes :: Eq a => [a] -> [a]    
dupes :: [a] -> [a]
dupes [] = []
dupes [a
_] = []
dupes [a
x,a
y] = [a
x | a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y]
dupes (a
x:a
y:[a]
xs) = [a] -> [a]
forall a. Eq a => [a] -> [a]
dupes(a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a
y]) [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. Eq a => [a] -> [a]
dupes(a
y a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
xs)

--Data.Vector.indexed but for lists
indexed :: [a] -> [(Int, a)]
indexed :: [a] -> [(Int, a)]
indexed = Int -> [a] -> [(Int, a)]
forall t b. Num t => t -> [b] -> [(t, b)]
go Int
0
  where
    go :: t -> [b] -> [(t, b)]
go t
_ [] = []
    go t
i (b
v:[b]
ys) = (t
i,b
v)(t, b) -> [(t, b)] -> [(t, b)]
forall a. a -> [a] -> [a]
:t -> [b] -> [(t, b)]
go (t
it -> t -> t
forall a. Num a => a -> a -> a
+t
1) [b]
ys