/*
         * public static List<T> filterRange<T>(String indexes, List<T> input, indexOps operation = indexOps.pass)
         *  where T : IRelatedCollectionItem
         * {
         *  if (input == null) return new List<T>();
         *  List<Int32> indexList = indexes.rangeStringToIndexList();
         *
         *  return filterRange<T>(indexList, input, operation);
         * }
         *
         * /// <summary>
         * /// Uzima elemente koji su navedeni u listi
         * /// </summary>
         * /// <typeparam name="T"></typeparam>
         * /// <param name="indexes"></param>
         * /// <param name="input"></param>
         * /// <param name="operation"></param>
         * /// <returns></returns>
         * public static List<T> filterRange<T>(List<Int32> indexes, List<T> input, indexOps operation = indexOps.pass)
         *  where T : IRelatedCollectionItem
         * {
         *  if (input == null) return new List<T>();
         *  // Int32 ti = Convert.ToInt32(x.id);
         *  switch (operation)
         *  {
         *      default:
         *      case indexOps.pass:
         *          return input.Where(x => indexes.Contains(Convert.ToInt32(x.id))).ToList();
         *          break;
         *
         *      case indexOps.remove:
         *          return input.Where(x => !indexes.Contains(Convert.ToInt32(x.id))).ToList();
         *          break;
         *  }
         * }
         */

        /// <summary>
        /// Obrađuju string podatak korišćenjem imbIndexOps metoda
        /// </summary>
        /// <param name="indexes">Indeksna instrukcija</param>
        /// <param name="input">Ulazni string</param>
        /// <param name="operation">Tip operacije</param>
        /// <returns>Rezultat</returns>
        public static List <string> filterStringRange(String indexes, List <string> input,
                                                      indexOps operation = indexOps.pass)
        {
            var ind = indexes.rangeStringToIndexList(input.Count);

            List <String> output = new List <string>();

            foreach (Int32 i in ind)
            {
                output.Add(input[i]);
            }

            return(output);
        }
        ///// <summary>
        ///// Obrađuju string podatak korišćenjem imbIndexOps metoda
        ///// </summary>
        ///// <param name="indexes">Indeksna instrukcija</param>
        ///// <param name="input">Ulazni string</param>
        ///// <param name="operation">Tip operacije</param>
        ///// <returns>Rezultat</returns>
        //public static String imbIndexOps(this String input, String indexes, indexOps operation = indexOps.pass)
        //{
        //    return
        //        filterStringRange(indexes.rangeStringToIndexList(), input.getStringLineList(StringSplitOptions.None)).
        //            toCsvInLine(Environment.NewLine);
        //}

        ///// <summary>
        ///// Obrađuju string podatak korišćenjem imbIndexOps metoda
        ///// </summary>
        ///// <param name="indexes">Indeksi</param>
        ///// <param name="input">Ulazni string</param>
        ///// <param name="operation">Tip operacije</param>
        ///// <returns>Rezultat</returns>
        //public static String imbIndexOps(this String input, List<int> indexes, indexOps operation = indexOps.pass)
        //{
        //    return filterStringRange(indexes, input.getStringLineList(StringSplitOptions.None)).toCsvInLine(Environment.NewLine);
        //}

        ///// <summary>
        ///// Vraca string koji sadrži samo linije koje imaju needle
        ///// </summary>
        ///// <param name="input">Ulazni string</param>
        ///// <param name="needle">String koji se traži</param>
        ///// <param name="inverseTest">Da li da invertuje razultate</param>
        ///// <returns>Samo linije koje imaju needle</returns>
        //public static String imbLinesWithNeedle(this String input, String needle, Boolean inverseTest = false)
        //{
        //    return
        //        input.getStringLineList(StringSplitOptions.RemoveEmptyEntries, needle, inverseTest).toCsvInLine(
        //            Environment.NewLine);
        //}

        /*
         * public static List<T> filterRange<T>(String indexes, List<T> input, indexOps operation = indexOps.pass)
         *  where T : IRelatedCollectionItem
         * {
         *  if (input == null) return new List<T>();
         *  List<Int32> indexList = indexes.rangeStringToIndexList();
         *
         *  return filterRange<T>(indexList, input, operation);
         * }
         *
         * /// <summary>
         * /// Uzima elemente koji su navedeni u listi
         * /// </summary>
         * /// <typeparam name="T"></typeparam>
         * /// <param name="indexes"></param>
         * /// <param name="input"></param>
         * /// <param name="operation"></param>
         * /// <returns></returns>
         * public static List<T> filterRange<T>(List<Int32> indexes, List<T> input, indexOps operation = indexOps.pass)
         *  where T : IRelatedCollectionItem
         * {
         *  if (input == null) return new List<T>();
         *  // Int32 ti = Convert.ToInt32(x.id);
         *  switch (operation)
         *  {
         *      default:
         *      case indexOps.pass:
         *          return input.Where(x => indexes.Contains(Convert.ToInt32(x.id))).ToList();
         *          break;
         *
         *      case indexOps.remove:
         *          return input.Where(x => !indexes.Contains(Convert.ToInt32(x.id))).ToList();
         *          break;
         *  }
         * }
         */

        ///// <summary>
        ///// Obrađuju string podatak korišćenjem imbIndexOps metoda
        ///// </summary>
        ///// <param name="indexes">Indeksna instrukcija</param>
        ///// <param name="input">Ulazni string</param>
        ///// <param name="operation">Tip operacije</param>
        ///// <returns>Rezultat</returns>
        //public static List<string> filterStringRange(String indexes, List<string> input,
        //                                             indexOps operation = indexOps.pass)
        //{
        //    var ind = indexes.rangeStringToIndexList(input.Count);

        //    List<String> output = new List<string>();

        //    foreach (Int32 i in ind) output.Add(input[i]);

        //    return output;
        //}

        public static List <T> imbIndexOps <T>(this IList <T> source, List <Int32> indexMap, indexOps ops = indexOps.pass)
        {
            List <T> output = new List <T>();

            foreach (Int32 i in indexMap)
            {
                output.Add(source[i]);
            }

            return(output);
        }