/// <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); }
/// <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); }
/// <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); }
/// <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())); }