/// <summary>
        /// writes results (all possible module lists) to a file
        /// </summary>
        /// <param name="fileName">file name to write to</param>
        /// <param name="lists">all possible module lists</param>
        static void SaveResults(string fileName, ModuleListContainer lists)
        {
            using (StreamWriter writer = new StreamWriter(fileName)) {
                if (lists == null || lists.Count == 0)
                {
                    writer.WriteLine("Nėra įmanomų modulių priklausomybės sąrašų");
                }
                else
                {
                    writer.WriteLine("Visi įmanomi modulių priklausomybės sąrašai:");

                    for (int i = 0; i < lists.Count; i++)
                    {
                        ModuleList list = lists.GetModuleList(i);

                        for (int j = 0; j < list.Count; j++)
                        {
                            writer.WriteLine("{0} {1}", list.GetModule(j).Code, list.GetModule(j).Name);
                        }

                        writer.WriteLine();
                    }
                }
            }
        }
        /// <summary>
        /// entry point of the program
        /// </summary>
        /// <param name="args">arguments for the program</param>
        static void Main(string[] args)
        {
            ModuleList allModules = ReadData("U2.txt");

            WriteInitialDataToFile("PradDuomenys.txt", allModules);

            FindDependentModules(allModules);
            ModuleListContainer lists = FindAllPosibleModuleLists(allModules);

            SaveResults("Rezultatai.txt", lists);
        }
        /// <summary>
        /// finds all possible module dependency lists
        /// </summary>
        /// <param name="modules">list of all modules</param>
        /// <returns>ModuleListContainer with all possible lists in it</returns>
        static ModuleListContainer FindAllPosibleModuleLists(ModuleList modules)
        {
            if (ZeroListsPossible(modules))
            {
                return(null);
            }

            ModuleListContainer moduleLists = new ModuleListContainer(10000);

            for (int i = 0; i < modules.Count; i++)
            {
                CreateModuleLists(moduleLists, modules, modules.GetModule(i));
            }

            return(moduleLists);
        }
        /// <summary>
        /// creates all possible lists where specific module is in positions from
        /// it's needed modules count to the number of modules that depend on it
        /// </summary>
        /// <param name="lists">module list container containing all formed dependency lists</param>
        /// <param name="modules">all modules that can be chosen</param>
        /// <param name="module">module which will be placed in specific positions</param>
        static void CreateModuleLists(ModuleListContainer lists, ModuleList modules, Module module)
        {
            int neededModulesCount    = module.GetNeededModules().Length;
            int dependentModulesCount = module.DependentModulesCount;

            for (int j = neededModulesCount; j < modules.Count - dependentModulesCount; j++)
            {
                ModuleList list = new ModuleList(modules.Count);
                ModuleList unnecessaryModules = FindUnnecessaryModules(modules, module);
                AddNeededModulesToTheList(modules, list, module.GetNeededModules());
                list.AddAll(unnecessaryModules);
                list.MoveModuleTo(module, j);

                AddDependentModulesToTheList(modules, list, module.DependentModules, module.DependentModulesCount);

                if (!lists.Contains(list) && ValidList(list))
                {
                    lists.AddModuleList(list);
                }
            }
        }