Exemple #1
0
        /// <inheritdoc />
        protected override async Task <Result <bool, IError> > Run(
            IStateMonad stateMonad,
            CancellationToken cancellationToken)
        {
            var superstringResult = await String.Run(stateMonad, cancellationToken)
                                    .Map(async x => await x.GetStringAsync());

            if (superstringResult.IsFailure)
            {
                return(superstringResult.ConvertFailure <bool>());
            }

            var substringResult = await Substring.Run(stateMonad, cancellationToken)
                                  .Map(async x => await x.GetStringAsync());

            if (substringResult.IsFailure)
            {
                return(substringResult.ConvertFailure <bool>());
            }

            var ignoreCaseResult = await IgnoreCase.Run(stateMonad, cancellationToken);

            if (ignoreCaseResult.IsFailure)
            {
                return(ignoreCaseResult.ConvertFailure <bool>());
            }

            var comparison = ignoreCaseResult.Value
            ? StringComparison.OrdinalIgnoreCase
            : StringComparison.Ordinal;

            var r = superstringResult.Value.Contains(substringResult.Value, comparison);

            return(r);
        }
Exemple #2
0
        /// <inheritdoc />
        protected override async Task <Result <Array <T>, IError> > Run(
            IStateMonad stateMonad,
            CancellationToken cancellationToken)
        {
            var entityStreamResult = await Array.Run(stateMonad, cancellationToken);

            if (entityStreamResult.IsFailure)
            {
                return(entityStreamResult.ConvertFailure <Array <T> >());
            }

            var ignoreCaseResult = await IgnoreCase.Run(stateMonad, cancellationToken);

            if (ignoreCaseResult.IsFailure)
            {
                return(ignoreCaseResult.ConvertFailure <Array <T> >());
            }

            IEqualityComparer <string> comparer = ignoreCaseResult.Value
            ? StringComparer.OrdinalIgnoreCase
            : StringComparer.Ordinal;

            HashSet <string> usedKeys = new(comparer);

            var currentState = stateMonad.GetState().ToImmutableDictionary();

            async IAsyncEnumerable <T> Filter(T element)
            {
                await using var scopedMonad = new ScopedStateMonad(
                                stateMonad,
                                currentState,
                                new KeyValuePair <VariableName, object>(Variable, element !)
                                );

                var result = await KeySelector.Run(scopedMonad, cancellationToken)
                             .Map(async x => await x.GetStringAsync());

                if (result.IsFailure)
                {
                    throw new ErrorException(result.Error);
                }

                if (usedKeys.Add(result.Value))
                {
                    yield return(element);
                }
            }

            var newStream = entityStreamResult.Value.SelectMany(Filter);

            return(newStream);
        }
Exemple #3
0
        /// <inheritdoc />
        protected override async Task <Result <bool, IError> > Run(
            IStateMonad stateMonad,
            CancellationToken cancellationToken)
        {
            var stringResult =
                await String.Run(stateMonad, cancellationToken).Map(x => x.GetStringAsync());

            if (stringResult.IsFailure)
            {
                return(stringResult.ConvertFailure <bool>());
            }

            var patternResult =
                await Pattern.Run(stateMonad, cancellationToken).Map(x => x.GetStringAsync());

            if (patternResult.IsFailure)
            {
                return(patternResult.ConvertFailure <bool>());
            }

            var ignoreCaseResult = await IgnoreCase.Run(stateMonad, cancellationToken);

            if (ignoreCaseResult.IsFailure)
            {
                return(ignoreCaseResult.ConvertFailure <bool>());
            }

            var regexOptions = RegexOptions.None;

            if (ignoreCaseResult.Value)
            {
                regexOptions |= RegexOptions.IgnoreCase;
            }

            var isMatch = Regex.IsMatch(stringResult.Value, patternResult.Value, regexOptions);

            return(isMatch);
        }
Exemple #4
0
        /// <inheritdoc />
        protected override async Task <Result <StringStream, IError> > Run(
            IStateMonad stateMonad,
            CancellationToken cancellationToken)
        {
            var stringResult =
                await String.Run(stateMonad, cancellationToken).Map(x => x.GetStringAsync());

            if (stringResult.IsFailure)
            {
                return(stringResult.ConvertFailure <StringStream>());
            }

            var patternResult =
                await Pattern.Run(stateMonad, cancellationToken).Map(x => x.GetStringAsync());

            if (patternResult.IsFailure)
            {
                return(patternResult.ConvertFailure <StringStream>());
            }

            var ignoreCaseResult = await IgnoreCase.Run(stateMonad, cancellationToken);

            if (ignoreCaseResult.IsFailure)
            {
                return(ignoreCaseResult.ConvertFailure <StringStream>());
            }

            var currentState = stateMonad.GetState().ToImmutableDictionary();

            var regexOptions = RegexOptions.None;

            if (ignoreCaseResult.Value)
            {
                regexOptions |= RegexOptions.IgnoreCase;
            }

            var regex     = new Regex(patternResult.Value, regexOptions);
            var input     = stringResult.Value;
            var sb        = new StringBuilder();
            var lastIndex = 0;

            foreach (Match match in regex.Matches(input))
            {
                sb.Append(input, lastIndex, match.Index - lastIndex);

                await using var scopedMonad = new ScopedStateMonad(
                                stateMonad,
                                currentState,
                                new KeyValuePair <VariableName, object>(Variable, new StringStream(match.Value))
                                );

                var result = await Function.Run(scopedMonad, cancellationToken)
                             .Map(x => x.GetStringAsync());

                if (result.IsFailure)
                {
                    return(result.ConvertFailure <StringStream>());
                }

                sb.Append(result.Value);

                lastIndex = match.Index + match.Length;
            }

            sb.Append(input, lastIndex, input.Length - lastIndex);
            return(new StringStream(sb.ToString()));
        }