Пример #1
0
 public ILazyStatus Next(ILazyStatus status)
 {
     try
     {
         return(status.IsAccepted ? Accepted.New(predicate.Invoke(status.Object).IsTrue ? lambda.Invoke(status.Object) : status.Object) : status);
     }
     catch (Exception exception)
     {
         return(new Failed(exception));
     }
 }
Пример #2
0
        public ILazyStatus Next(ILazyStatus status)
        {
            if (status.IsAccepted && taking)
            {
                if (!predicate.Invoke(status.Object).IsTrue)
                {
                    return(status);
                }

                taking = false;
            }

            return(new Ended());
        }
Пример #3
0
        public ILazyStatus Next(ILazyStatus status)
        {
            if (status.IsAccepted && skipping)
            {
                if (predicate.Invoke(status.Object).IsTrue)
                {
                    return(new Skipped());
                }

                skipping = false;
            }

            return(status);
        }
Пример #4
0
        public bool Match(IObject comparisand, Hash <string, IObject> bindings)
        {
            lambda.CopyFields(fields);
            var result = lambda.Invoke(comparisand);

            switch (result)
            {
            case Boolean boolean when arguments.Length == 0:
                return(boolean.Value);

            case Boolean boolean when arguments.Length == 1:
                return(match(boolean, arguments[0], bindings));

            case Some some when arguments.Length == 1:
                return(match(some.Value, arguments[0], bindings));

            default:
                if (result is Some {
                    Value : Tuple tuple
                } && tuple.Length.Value == arguments.Length)
                {
                    return(tuple.Value.Zip(arguments, (l, r) => match(l, r, bindings)).All(b => b));
                }

                break;
            }
Пример #5
0
        public IMaybe <IObject> Next(int index)
        {
            var result = current;

            current = lambda.Invoke(current);

            return(result.Some());
        }
Пример #6
0
        public virtual IObject FlatMap(Lambda lambda)
        {
            var className  = ((BaseClass)collectionClass).Name;
            var enumerable = List().ToList().Select(value => lambda.Invoke(value));
            var flattened  = flatten(enumerable, className);

            return(collectionClass.Revert(flattened));
        }
Пример #7
0
        public IObject First(Lambda predicate)
        {
            foreach (var value in List().ToList().Where(value => predicate.Invoke(value).IsTrue))
            {
                return(new Some(value));
            }

            return(Objects.None.NoneValue);
        }
Пример #8
0
        public IObject Max(Lambda lambda)
        {
            var result = Unassigned.Value;

            if (lambda.Invokable.Parameters.Length == 2)
            {
                foreach (var value in List().ToList())
                {
                    if (result is Unassigned)
                    {
                        result = value;
                    }
                    else if (((Int)lambda.Invoke(value, result)).Value < 0)
                    {
                        result = value;
                    }
                }
            }
            else
            {
                var list = List().ToList();
                result = list[0];
                var compareResult = lambda.Invoke(result);
                foreach (var value in list.Skip(1))
                {
                    var valueResult = lambda.Invoke(value);
                    if (valueResult is IObjectCompare oc)
                    {
                        if (oc.Compare(compareResult) > 0)
                        {
                            result        = value;
                            compareResult = valueResult;
                        }
                    }
                    else
                    {
                        throw incompatibleClasses(valueResult, "Object compare");
                    }
                }
            }

            return(result);
        }
Пример #9
0
        public IObject Replace(Lambda predicate, Lambda lambda)
        {
            var list = new List <IObject>();

            foreach (var item in List().ToList())
            {
                list.Add(predicate.Invoke(item).IsTrue ? lambda.Invoke(item) : item);
            }

            return(collectionClass.Revert(list));
        }
Пример #10
0
        public IObject Last(Lambda predicate)
        {
            var list = List().ToList();

            list.Reverse();
            foreach (var value in list.Where(value => predicate.Invoke(value).IsTrue))
            {
                return(new Some(value));
            }

            return(Objects.None.NoneValue);
        }
Пример #11
0
        public IObject Sort(Lambda lambda, bool ascending)
        {
            switch (lambda.Invokable.Parameters.Length)
            {
            case 1:
                List <IObject> result;
                result = ascending ? List().ToList().OrderBy(i => lambda.Invoke(i)).ToList()
                  : List().ToList().OrderByDescending(i => lambda.Invoke(i)).ToList();

                return(collectionClass.Revert(result));

            case 2:
                var array = List().ToArray();
                System.Array.Sort(array, (i, j) => ((Int)lambda.Invoke(i, j)).Value);

                return(collectionClass.Revert(array));

            default:
                return((IObject)collection);
            }
        }
Пример #12
0
        public IObject ReduceLeft(IObject initialValue, Lambda lambda)
        {
            var current = initialValue;
            var result  = new List <IObject> {
                current
            };

            foreach (var value in List().ToList())
            {
                current = lambda.Invoke(current, value);
                result.Add(current);
            }

            return(collectionClass.Revert(result));
        }
Пример #13
0
        public IObject Index(Lambda predicate)
        {
            var i = 0;

            foreach (var value in List().ToList())
            {
                if (predicate.Invoke(value).IsTrue)
                {
                    return(new Some((Int)i));
                }

                i++;
            }

            return(Objects.None.NoneValue);
        }
Пример #14
0
        public IObject Indexes(Lambda predicate)
        {
            var i      = 0;
            var result = new List <IObject>();

            foreach (var value in List().ToList())
            {
                if (predicate.Invoke(value).IsTrue)
                {
                    result.Add((Int)i);
                }

                i++;
            }

            return(collectionClass.Revert(result));
        }
Пример #15
0
        public IObject ReduceRight(IObject initialValue, Lambda lambda)
        {
            var current = initialValue;
            var result  = new List <IObject> {
                current
            };
            var list = List().ToList();

            list.Reverse();
            foreach (var value in list)
            {
                current = lambda.Invoke(value, current);
                result.Add(current);
            }

            return(collectionClass.Revert(result));
        }
Пример #16
0
        public Boolean One(Lambda predicate)
        {
            var one = false;

            foreach (var _ in List().ToList().Where(value => predicate.Invoke(value).IsTrue))
            {
                if (one)
                {
                    return(new Boolean(false));
                }
                else
                {
                    one = true;
                }
            }

            return(new Boolean(true));
        }
Пример #17
0
        public IObject FoldLeft(Lambda lambda)
        {
            var firstObtained = false;
            var current       = Unassigned.Value;

            foreach (var value in List().ToList())
            {
                if (firstObtained)
                {
                    current = lambda.Invoke(current, value);
                }
                else
                {
                    current       = value;
                    firstObtained = true;
                }
            }

            return(current);
        }
Пример #18
0
        public IObject Split(Lambda predicate)
        {
            var ifTrue  = new List <IObject>();
            var ifFalse = new List <IObject>();

            foreach (var value in List().ToList())
            {
                if (predicate.Invoke(value).IsTrue)
                {
                    ifTrue.Add(value);
                }
                else
                {
                    ifFalse.Add(value);
                }
            }

            return(collectionClass.Revert(new List <IObject> {
                collectionClass.Revert(ifTrue), collectionClass.Revert(ifFalse)
            }));
        }
Пример #19
0
        public IObject FoldRight(Lambda lambda)
        {
            var firstObtained = false;
            var current       = Unassigned.Value;
            var list          = List().ToList();

            list.Reverse();
            foreach (var value in list)
            {
                if (firstObtained)
                {
                    current = lambda.Invoke(value, current);
                }
                else
                {
                    current       = value;
                    firstObtained = true;
                }
            }

            return(current);
        }
Пример #20
0
        public virtual IObject GroupBy(Lambda lambda)
        {
            var hash = new AutoHash <IObject, List <IObject> >(_ => new List <IObject>())
            {
                AutoAddDefault = true
            };

            foreach (var item in List().ToList())
            {
                var key = lambda.Invoke(item);
                hash[key].Add(item);
            }

            var result = new Hash <IObject, IObject>();

            foreach (var key in hash.KeyArray())
            {
                result[key] = collectionClass.Revert(hash[key]);
            }

            return(new Dictionary(result));
        }
Пример #21
0
        public IObject ReduceRight(Lambda lambda)
        {
            var firstObtained = false;
            var current       = Unassigned.Value;
            var result        = new List <IObject>();

            foreach (var value in List().ToList())
            {
                if (firstObtained)
                {
                    current = lambda.Invoke(value, current);
                    result.Add(current);
                }
                else
                {
                    current = value;
                    result.Add(current);
                    firstObtained = true;
                }
            }

            return(collectionClass.Revert(result));
        }
Пример #22
0
        public IObject Zip(ICollection collection, Lambda lambda)
        {
            var rightList = collection.GetIterator(false).List().ToList();

            return(collectionClass.Revert(List().ToList().Zip(rightList, (x, y) => lambda.Invoke(x, y))));
        }
Пример #23
0
 public Int Count(Lambda predicate) => List().Count(value => predicate.Invoke(value).IsTrue);
Пример #24
0
        public IObject Cross(ICollection collection, Lambda lambda)
        {
            var result = new List <IObject>();

            foreach (var left in List().ToList())
            {
                result.AddRange(collection.GetIterator(false).List().ToList().Select(right => lambda.Invoke(left, right)));
            }

            return(collectionClass.Revert(result));
        }
Пример #25
0
 public Boolean All(Lambda predicate) => List().ToList().All(value => predicate.Invoke(value).IsTrue);
Пример #26
0
 public Boolean None(Lambda predicate)
 {
     return(List().ToList().All(value => !predicate.Invoke(value).IsTrue));
 }
Пример #27
0
 public virtual IObject Map(Lambda lambda) => collectionClass.Revert(List().ToList().Select(value => lambda.Invoke(value)));
Пример #28
0
 public virtual IObject IfNot(Lambda predicate) => collectionClass.Revert(List().ToList().Where(value => !predicate.Invoke(value).IsTrue));
Пример #29
0
 public virtual IObject SkipWhile(Lambda predicate)
 {
     return(collectionClass.Revert(List().ToList().SkipWhile(value => predicate.Invoke(value).IsTrue)));
 }
Пример #30
0
 public virtual IObject TakeUntil(Lambda predicate)
 {
     return(collectionClass.Revert(List().ToList().TakeWhile(value => !predicate.Invoke(value).IsTrue)));
 }