with Integer_Vectors;                    use Integer_Vectors;
with Integer_Vectors_of_Vectors;
with Lists_of_Integer_Vectors;           use Lists_of_Integer_Vectors;
with Arrays_of_Integer_Vector_Lists;     use Arrays_of_Integer_Vector_Lists;

package Arrays_of_Lists_Utilities is

-- DESCRIPTION :
--   This package offers some utilities for working with
--   arrays of lists of integer vectors.

  function All_Equal ( al : Array_of_Lists ) return boolean;

  -- DESCRIPTION :
  --   returns true if all lists in al are the same.

  function Interchange2 ( al : Array_of_Lists ) return Array_of_Lists;

  -- DESCRIPTION :
  --   Returns a permuted array such that if the original array contains
  --   a list of length less than or equal to 2, the permuted array has
  --   this list on its first position.

  function Index2 ( al : Array_of_Lists ) return integer;

  -- DESCRIPTION :
  --   Returns the index of the list in the array which has a length less
  --   than or equal to 2.  If no such list can be found, then al'first
  --   will be returned.

  procedure Mixture ( al : in Array_of_Lists; perm,mix : out Link_to_Vector );

  -- DESCRIPTION :
  --   Computes the mixture of the sets in al: mix(i) indicates how many
  --   times the ith list, given by al(perm(i)), occurs in the array.
  --   The list with minimal occurence stands in front.

  function Permute ( perm : Vector; al : in Array_of_Lists )
                   return Array_of_Lists;

  -- DESCRIPTION :
  --   The returned array is permuted according to the permutation vector.

  function Different_Points ( al : Array_of_Lists ) return List;

  -- DESCRIPTION :
  --   Returns a list of all different points from the lists
  --   of al, the first list will not be considered.

  function Different_Points ( al : Array_of_Lists ) return Array_of_Lists;

  -- DESCRIPTION :
  --   Returns lists of all different points from the lists
  --   of al, the first list will not be considered.

  procedure Remove_Duplicates ( al : in out Array_of_Lists );

  -- DESCRIPTION :
  --   Except for the first list, all duplicates will be removed from
  --   the lists in al.

  procedure Shift ( al : in out Array_of_Lists;
                    shiftvecs : in Integer_Vectors_of_Vectors.Vector );
  function  Shift ( al : Array_of_Lists;
                    shiftvecs : Integer_Vectors_of_Vectors.Vector )
                  return Array_of_Lists;

  -- DESCRIPTION :
  --   All lists in al will be shifted along the degrees in shiftvecs.

  -- REQUIRED :
  --   The ranges of shiftvecs and al are the same.

  procedure Projection ( al : in Array_of_Lists; v : in Vector;
                         ind : integer; res : in out Array_of_Lists;
                         degenerate : out boolean );
  -- DESCRIPTION :
  --   The first list in al will not be considered.
  --   after termination:
  --   1. degenerate = false:
  --    res is an array of degrees lists where for all points x in
  --    the list res(i) the following holds: < x , v > = pv, where
  --    pv equals the support of the list res(i) in the direction v.
  --    The ind-entry of each point in the lists has been deleted.
  --    Duplicates have been removed from the lists.
  --   2. degenerate = true:
  --    if there exists an entry i for which Length_Of(res(i)) = 1.

  -- REQUIRED : al'first = res'first and al'last = res'last + 1

end Arrays_of_Lists_Utilities;
