Current section

Files

Jump to
more_stream_data lib more_stream_data utils.ex
Raw

lib/more_stream_data/utils.ex

defmodule MoreStreamData.Utils do
@moduledoc false
@doc """
Randomly uppercases and downcases characters from the generated string
"""
@spec recase(StreamData.t(String.t()) | String.t()) :: StreamData.t(String.t())
def recase(string) when is_binary(string), do: string |> StreamData.constant() |> recase()
def recase(str_gen) do
str_gen
|> StreamData.bind(fn str ->
StreamData.bind(
StreamData.list_of(StreamData.boolean(), length: String.length(str)),
fn booleans ->
Enum.zip(String.graphemes(str), booleans)
|> Enum.map_join("", fn
{char, true} -> String.upcase(char)
{char, false} -> String.downcase(char)
end)
|> StreamData.constant()
end
)
end)
end
end