public bool Create <T, R>(IEnumerable <T> items, Func <T, R> orderBy = null)
        {
            try
            {
                IOBoundary      iob  = IOBoundary.Create <T>();
                IEnumerable <T> prev = iob.Read().Select(line => JsonConvert.DeserializeObject <T>(line));
                items = prev.Concat(items);

                if (orderBy != null)
                {
                    items.OrderBy(orderBy);
                }

                IEnumerable <string> lines = items.Select(i => JsonConvert.SerializeObject(i));

                iob.Write(lines);

                return(true);
            }
            catch (Exception e)
            {
                if (Program.Employee == 2)
                {
                    Console.WriteLine(e.Message);
                }
                return(false);
            }
        }
        public IEnumerable <T> Delete <T>(Func <T, bool> filter = null)
        {
            try
            {
                IOBoundary      iob = IOBoundary.Create <T>();
                IEnumerable <T> prev, toSave, toDelete;

                prev = iob.Read().Select(line => JsonConvert.DeserializeObject <T>(line));

                if (filter != null)
                {
                    toSave   = prev.Where(p => !filter(p));
                    toDelete = prev.Where(p => filter(p));
                }
                else
                {
                    toDelete = prev;
                    toSave   = Enumerable.Empty <T>();
                }

                IEnumerable <string> lines = toSave.Select(t => JsonConvert.SerializeObject(t));

                iob.Write(lines);

                return(toDelete);
            }
            catch (Exception e)
            {
                if (Program.Employee == 2)
                {
                    Console.WriteLine(e.Message);
                }
                return(Enumerable.Empty <T>());
            }
        }
        public IEnumerable <T> Read <T>(Func <T, bool> filter = null)
        {
            try
            {
                IOBoundary      iob  = IOBoundary.Create <T>();
                IEnumerable <T> prev = iob.Read().Select(line => JsonConvert.DeserializeObject <T>(line));

                if (filter != null)
                {
                    prev = prev.Where(filter);
                }

                return(prev);
            }
            catch (Exception e)
            {
                if (Program.Employee == 2)
                {
                    Console.WriteLine(e.Message);
                }
                return(Enumerable.Empty <T>());
            }
        }
        public bool Update <T>(Func <T, T> update, Func <T, bool> filter = null)
        {
            try
            {
                IOBoundary      iob = IOBoundary.Create <T>();
                IEnumerable <T> prev, toUpdate;

                prev = iob.Read().Select(line => JsonConvert.DeserializeObject <T>(line));

                if (filter != null)
                {
                    toUpdate = prev.Where(p => filter(p));
                    prev     = prev.Where(p => !filter(p));
                }
                else
                {
                    toUpdate = prev;
                    prev     = Enumerable.Empty <T>();
                }

                IEnumerable <T> updated = toUpdate.Select(update).ToArray();

                IEnumerable <string> lines = prev.Concat(updated).Select(x => JsonConvert.SerializeObject(x));

                iob.Write(lines);

                return(true);
            }
            catch (Exception e)
            {
                if (Program.Employee == 2)
                {
                    Console.WriteLine(e.Message);
                }
                return(false);
            }
        }