Library with some useful operations on lists.
Author: Michael Hanus, Bjoern Peemoeller
Version: November 2020
                elemIndex
                  :: Eq a => a -> [a] -> Maybe Int  Returns the index i
                of the first occurrence of an element in a list
as (Just i), otherwise Nothing
                is returned.
               | 
              
            
                elemIndices
                  :: Eq a => a -> [a] -> [Int]  Returns the list of indices of occurrences of an element in a list.  | 
              
            
                find
                  ::  (a -> Bool) -> [a] -> Maybe a  Returns the first element e
                of a list satisfying a predicate
as (Just e),
otherwise Nothing
                is returned.
               | 
              
            
                findIndex
                  ::  (a -> Bool) -> [a] -> Maybe Int  Returns the index i
                of the first occurrences of a list element
satisfying a predicate as (Just i), otherwise Nothing
                is returned.
               | 
              
            
                findIndices
                  ::  (a -> Bool) -> [a] -> [Int]  Returns the list of indices of list elements satisfying a predicate.  | 
              
            
                nub
                  :: Eq a => [a] -> [a]  Removes all duplicates in the argument list.  | 
              
            
                nubBy
                  ::  (a -> a -> Bool) -> [a] -> [a]  Removes all duplicates in the argument list according to an equivalence relation.  | 
              
            
                delete
                  :: Eq a => a -> [a] -> [a]  Deletes the first occurrence of an element in a list.  | 
              
            
                deleteBy
                  ::  (a -> a -> Bool) -> a -> [a] -> [a]  Deletes the first occurrence of an element in a list according to an equivalence relation.  | 
              
            
                (\\)
                  :: Eq a => [a] -> [a] -> [a]  Computes the difference of two lists.  | 
              
            
                union
                  :: Eq a => [a] -> [a] -> [a]  Computes the union of two lists.  | 
              
            
                unionBy
                  ::  (a -> a -> Bool) -> [a] -> [a] -> [a]  Computes the union of two lists according to the given equivalence relation  | 
              
            
                intersect
                  :: Eq a => [a] -> [a] -> [a]  Computes the intersection of two lists.  | 
              
            
                intersectBy
                  ::  (a -> a -> Bool) -> [a] -> [a] -> [a]  Computes the intersection of two lists according to the given equivalence relation  | 
              
            
                intersperse
                  ::  a -> [a] -> [a]  Puts a separator element between all elements in a list.  | 
              
            
                intercalate
                  ::  [a] -> [[a]] -> [a]  intercalate xs xss
                is equivalent to (concat (intersperse xs xss)).
               | 
              
            
                transpose
                  ::  [[a]] -> [[a]]  Transposes the rows and columns of the argument.  | 
              
            
                diagonal
                  ::  [[a]] -> [a]  Diagonalization of a list of lists.  | 
              
            
                permutations
                  ::  [a] -> [[a]]  Returns the list of all permutations of the argument.  | 
              
            
                partition
                  ::  (a -> Bool) -> [a] -> ([a],[a])  Partitions a list into a pair of lists where the first list contains those elements that satisfy the predicate argument and the second list contains the remaining arguments.  | 
              
            
                group
                  :: Eq a => [a] -> [[a]]  Splits the list argument into a list of lists of equal adjacent elements.  | 
              
            
                groupBy
                  ::  (a -> a -> Bool) -> [a] -> [[a]]  Splits the list argument into a list of lists of related adjacent elements.  | 
              
            
                splitOn
                  :: Eq a => [a] -> [a] -> [[a]]  Breaks the second list argument into pieces separated by the first list argument, consuming the delimiter.  | 
              
            
                split
                  ::  (a -> Bool) -> [a] -> [[a]]  Splits a list into components delimited by separators, where the predicate returns True for a separator element.  | 
              
            
                inits
                  ::  [a] -> [[a]]  Returns all initial segments of a list, starting with the shortest.  | 
              
            
                tails
                  ::  [a] -> [[a]]  Returns all final segments of a list, starting with the longest.  | 
              
            
                replace
                  ::  a -> Int -> [a] -> [a]  Replaces an element in a list.  | 
              
            
                isPrefixOf
                  :: Eq a => [a] -> [a] -> Bool  Checks whether a list is a prefix of another.  | 
              
            
                isSuffixOf
                  :: Eq a => [a] -> [a] -> Bool  Checks whether a list is a suffix of another.  | 
              
            
                isInfixOf
                  :: Eq a => [a] -> [a] -> Bool  Checks whether a list is contained in another.  | 
              
            
                sort
                  :: Ord a => [a] -> [a]  The default sorting operation, mergeSort, with standard ordering <=.
               | 
              
            
                sortBy
                  ::  (a -> a -> Bool) -> [a] -> [a]  Sorts a list w.r.t.  | 
              
            
                insertBy
                  ::  (a -> a -> Bool) -> a -> [a] -> [a]  Inserts an object into a list according to an ordering relation.  | 
              
            
                last
                  ::  [a] -> a  Returns the last element of a non-empty list.  | 
              
            
                init
                  ::  [a] -> [a]  Returns the input list with the last element removed.  | 
              
            
                sum
                  :: Num a => [a] -> a  Returns the sum of a list of integers.  | 
              
            
                product
                  :: Num a => [a] -> a  Returns the product of a list of integers.  | 
              
            
                maximum
                  :: Ord a => [a] -> a  Returns the maximum of a non-empty list.  | 
              
            
                maximumBy
                  ::  (a -> a -> Ordering) -> [a] -> a  Returns the maximum of a non-empty list according to the given comparison function  | 
              
            
                minimum
                  :: Ord a => [a] -> a  Returns the minimum of a non-empty list.  | 
              
            
                minimumBy
                  ::  (a -> a -> Ordering) -> [a] -> a  Returns the minimum of a non-empty list according to the given comparison function  | 
              
            
                scanl
                  ::  (a -> b -> a) -> a -> [b] -> [a]  scanl
                is similar to foldl, but returns a list of successive
reduced values from the left:
  scanl f z [x1, x2, ...] == [z, z f
                x1, (z f
                x1) f
                x2, ...]
               | 
              
            
                scanl1
                  ::  (a -> a -> a) -> [a] -> [a]  scanl1
                is a variant of scanl
                that has no starting value argument:
 scanl1 f [x1, x2, ...] == [x1, x1 f
                x2, ...]
               | 
              
            
                scanr
                  ::  (a -> b -> b) -> b -> [a] -> [b]  scanr
                is the right-to-left dual of scanl.
               | 
              
            
                scanr1
                  ::  (a -> a -> a) -> [a] -> [a]  scanr1
                is a variant of scanr
                that has no starting value argument.
               | 
              
            
                mapAccumL
                  ::  (a -> b -> (a,c)) -> a -> [b] -> (a,[c])  The mapAccumL
                function behaves like a combination of map
                and
foldl; it applies a function to each element of a list, passing
an accumulating parameter from left to right, and returning a final
value of this accumulator together with the new list.
               | 
              
            
                mapAccumR
                  ::  (a -> b -> (a,c)) -> a -> [b] -> (a,[c])  The mapAccumR
                function behaves like a combination of map
                and
foldr; it applies a function to each element of a list, passing
an accumulating parameter from right to left, and returning a final
value of this accumulator together with the new list.
               | 
              
            
                cycle
                  ::  [a] -> [a]  Builds an infinite list from a finite one.  | 
              
            
                unfoldr
                  ::  (a -> Maybe (b,a)) -> a -> [b]  Builds a list from a seed value.  | 
              
            
| 
                    
                     
                       
                      Returns the index   | 
                  
                
| 
                    
                     
                       Returns the list of indices of occurrences of an element in a list.  | 
                  
                
| 
                    
                     
                       
                      Returns the first element   | 
                  
                
| 
                    
                     
                       
                      Returns the index   | 
                  
                
| 
                    
                     
                       Returns the list of indices of list elements satisfying a predicate.  | 
                  
                
| 
                    
                     
                       Removes all duplicates in the argument list.  | 
                  
                
| 
                    
                     
                       Removes all duplicates in the argument list according to an equivalence relation.  | 
                  
                
| 
                    
                     
                       Deletes the first occurrence of an element in a list.  | 
                  
                
| 
                    
                     
                       Deletes the first occurrence of an element in a list according to an equivalence relation.  | 
                  
                
| 
                    
                     
                       Computes the difference of two lists. 
 
 
 
  | 
                  
                
| 
                    
                     
                       Computes the union of two lists.  | 
                  
                
| 
                    
                     
                       Computes the union of two lists according to the given equivalence relation  | 
                  
                
| 
                    
                     
                       Computes the intersection of two lists.  | 
                  
                
| 
                    
                     
                       Computes the intersection of two lists according to the given equivalence relation  | 
                  
                
| 
                    
                     
                       Puts a separator element between all elements in a list. 
                      Example:  
  | 
                  
                
| 
                    
                     
                       
                        | 
                  
                
| 
                    
                     
                       Transposes the rows and columns of the argument. 
                      Example:   | 
                  
                
| 
                    
                     
                       Diagonalization of a list of lists. Fairly merges (possibly infinite) list of (possibly infinite) lists. 
 
 
  | 
                  
                
| 
                    
                     
                       Returns the list of all permutations of the argument.  | 
                  
                
| 
                    
                     
                       Partitions a list into a pair of lists where the first list contains those elements that satisfy the predicate argument and the second list contains the remaining arguments. 
                      Example:   | 
                  
                
| 
                    
                     
                       Splits the list argument into a list of lists of equal adjacent elements. 
                      Example:   | 
                  
                
| 
                    
                     
                       Splits the list argument into a list of lists of related adjacent elements. 
 
 
  | 
                  
                
| 
                    
                     
                       Breaks the second list argument into pieces separated by the first list argument, consuming the delimiter. An empty delimiter is invalid, and will cause an error to be raised.  | 
                  
                
| 
                    
                     
                       Splits a list into components delimited by separators, where the predicate returns True for a separator element. The resulting components do not contain the separators. Two adjacent separators result in an empty component in the output. split (==[a](#a)) "aabbaca" == ["","","bb","c",""] split (==[a](#a)) "" == [""]  | 
                  
                
| 
                    
                     
                       
                      Returns all initial segments of a list, starting with the shortest.
Example:  
 
 
  | 
                  
                
| 
                    
                     
                       
                      Returns all final segments of a list, starting with the longest.
Example:  
  | 
                  
                
| 
                    
                     
                       Replaces an element in a list. 
 
 
  | 
                  
                
| 
                    
                     
                       Checks whether a list is a prefix of another. 
 
 
  | 
                  
                
| 
                    
                     
                       Checks whether a list is a suffix of another. 
 
 
  | 
                  
                
| 
                    
                     
                       Checks whether a list is contained in another. 
 
 
  | 
                  
                
| 
                    
                     
                       
                      The default sorting operation, mergeSort, with standard ordering   | 
                  
                
| 
                    
                     
                       Sorts a list w.r.t. an ordering relation by the insertion method.  | 
                  
                
| 
                    
                     
                       Inserts an object into a list according to an ordering relation. 
 
 
  | 
                  
                
| 
                    
                     
                       Returns the last element of a non-empty list. 
  | 
                  
                
| 
                    
                     
                       Returns the input list with the last element removed. 
  | 
                  
                
| 
                    
                     
                       Returns the sum of a list of integers.  | 
                  
                
| 
                    
                     
                       Returns the product of a list of integers.  | 
                  
                
| 
                    
                     
                       Returns the maximum of a non-empty list. 
  | 
                  
                
| 
                    
                     
                       Returns the maximum of a non-empty list according to the given comparison function 
  | 
                  
                
| 
                    
                     
                       Returns the minimum of a non-empty list. 
  | 
                  
                
| 
                    
                     
                       Returns the minimum of a non-empty list according to the given comparison function 
  | 
                  
                
| 
                    
                     
                       
                        | 
                  
                
| 
                    
                     
                       
                        | 
                  
                
| 
                    
                     
                       
                        | 
                  
                
| 
                    
                     
                       
                        | 
                  
                
| 
                    
                     
                       
                      The   | 
                  
                
| 
                    
                     
                       
                      The   | 
                  
                
| 
                    
                     
                       Builds an infinite list from a finite one. 
  | 
                  
                
| 
                    
                     
                       Builds a list from a seed value.  |