Hi Matt,

I am not on the core team nor do I speak for them. From what I have 
generally seen, "alternative APIs" that can be implemented as libraries 
generally should just stay libraries, unless there develops a strong 
following that makes it clear that such an API should be moved into the 
core.

Tangentially, is this code available anywhere?

As for my take on this proposal, I don't really agree with your responses 
to `then`. 

> The additional typing involved for the anonymous function distracts the 
reader from the pattern matching, which is the crux of the matter.

50% of the additional typing is related to specifying the return shape, and 
in this respect that typing is well worth it, because there's no guess 
work. Code is read far more often than written, and the implicit return 
structure of `pattern_filter` leaves me guessing about how it works in 
cases like this:

```
{1, 2, 3} |> pattern_filter({1, a, b})
#=> ?
```

`then` is mildly more verbose, but it composes clearly with functions 
without requiring macro magic:

# assertive success
iex(2)> {1, 2, 3} |> then(fn {1, a, b} -> {a, b} end)
{2, 3}

# fall back to nil or some other value
iex(4)> 1 |> then(fn {1, a, b} -> {a, b}; _ -> nil end)
nil

# assertive failure
iex(5)> 1 |> then(fn {1, a, b} -> {a, b} end)
** (FunctionClauseError)
```

`then` doesn't require that you learn any new API, you just do normal 
function stuff and everything works as expected. I'm not seeing a 
significant improvement with `pattern_filter` over this.

- Ben
On Thursday, December 15, 2022 at 3:48:39 PM UTC-5 
matt.fa...@covermymeds.com wrote:

> Hi again. I’m new to this so apologies if I’m coming off as clueless or 
> pushy. I’m wondering what, if any, next steps there are to advocate for 
> this. Should I share the code? Given what I mentioned in the responses 
> about using one variable or using a new `destructure`, is there still 
> disagreement?
>
>  
>
> Thanks!
>
> Matt F
>
>  
>
> *From: *<elixir-l...@googlegroups.com> on behalf of Sabiwara Yukichi <
> sabi...@gmail.com>
> *Reply-To: *"elixir-l...@googlegroups.com" <elixir-l...@googlegroups.com>
> *Date: *Tuesday, December 13, 2022 at 6:55 PM
> *To: *"elixir-l...@googlegroups.com" <elixir-l...@googlegroups.com>
> *Subject: *[EXTERNAL] Re: [elixir-core:11213] [proposal] Use patterns to 
> filter data (good for pipes)
>
>  
>
> This email came from a source outside of CoverMyMeds. Use caution when 
> clicking on links or replying with confidential information.
> ------------------------------
>
> This is an interesting idea, but maybe `then/2` (or case/2 if you're fine 
> piping in it) could already cover these cases quite well (equivalent to 
> your pattern_filter! function):
>
>  
>
> "$3.45" |> then(fn "$" <> money -> money end) |> String.to_float()
>
> "$3.45" |> case do "$" <> money -> money end |> String.to_float()
>
>  
>
> The non-raising alternative might be slightly more verbose because you 
> need a second clause. But most of the time (like your money example), the 
> next step of the pipe might fail on nil anyway. Or maybe a with/1 pipeline 
> might work better than the pipe operator if you want a succession of 
> happy-path matches?
>
>  
>
> If we move forward, it might be better to explicitly declare the returned 
> expression, not just infer it from dangling variables: it isn't obvious 
> what should `{a, b}` or `{a, b, a}` return. Something like:
>
>  
>
> {1, 2, 1} |> pattern_filter(b <- {a, b, a})
>
>  
>
> Le mer. 14 déc. 2022 à 05:50, 'Matt Farabaugh' via elixir-lang-core <
> elixir-l...@googlegroups.com> a écrit :
>
> All,
>
>  
>
> I wrote a macro which allows for using a pattern to essentially extract a 
> value from a data structure:
>
>  
>
>
> @doc """
> Filter a value out of data using a pattern with one variable. Returns a 
> default value
> if no match. Raises if pattern contains no variables or more than one 
> variable.
>
> ## Examples
>
> iex> "$3.45" |> PatternHelpers.pattern_filter("$" <> money) |> 
> String.to_float()
> 3.45
>
> iex> {1,2,3} |> PatternHelpers.pattern_filter({1,_,a})
> 3
>
> iex> %{a: 1, b: 2} |> PatternHelpers.pattern_filter(%{a: 9, b: b})
> nil
>
> iex> %{a: 1, b: 2} |> PatternHelpers.pattern_filter(%{a: 9, b: b}, "???")
> "???"
> """
>
>  
>
> And an unsafe version:
>
>  
>
> @doc """
> See `pattern_filter/3`. Raises if no match.
>
> ## Examples
>
> iex> {1,2,3} |> PatternHelpers.pattern_filter!({9,_,b})
> ** (MatchError) no match of right hand side value: {1, 2, 3}
> """
>
>  
>
> This is my first proposal. Please let me know if this idea is worth some 
> attention, and how I might better do my part to present it. I have code 
> obviously but I'm not sure this is the place for it.
>
>  
>
> Thanks,
>
> Matt F
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-co...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/4b65083e-6c36-4519-a0ed-fa2da8b61a9bn%40googlegroups.com
>  
> <https://urldefense.com/v3/__https:/groups.google.com/d/msgid/elixir-lang-core/4b65083e-6c36-4519-a0ed-fa2da8b61a9bn*40googlegroups.com?utm_medium=email&utm_source=footer__;JQ!!LBRzLL-rxcoG!soAu7_j204hUseqlxMsemQMOhOz0yO8WygSZdV2t7WGq5iDQfDh-prkOc8PkTmo4vz08vKeE_ZmAZ19k2vMrPomauA$>
> .
>
> -- 
> You received this message because you are subscribed to the Google Groups 
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to elixir-lang-co...@googlegroups.com.
>
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/elixir-lang-core/CANnyohYy8hRvu2WD%2BMUEzWS2SxoA8eYk9PETOe8jGxr2tiuW%2BA%40mail.gmail.com
>  
> <https://urldefense.com/v3/__https:/groups.google.com/d/msgid/elixir-lang-core/CANnyohYy8hRvu2WD*2BMUEzWS2SxoA8eYk9PETOe8jGxr2tiuW*2BA*40mail.gmail.com?utm_medium=email&utm_source=footer__;JSUl!!LBRzLL-rxcoG!soAu7_j204hUseqlxMsemQMOhOz0yO8WygSZdV2t7WGq5iDQfDh-prkOc8PkTmo4vz08vKeE_ZmAZ19k2vMQT4CMDA$>
> .
>
> This electronic transmission is confidential and intended solely for the 
> addressee(s). If you are not an intended addressee, do not disclose, copy 
> or take any other action in reliance on this transmission. If you have 
> received this transmission in error, please delete it from your system and 
> notify CoverMyMeds LLC at pri...@covermymeds.com. Thank you.
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/b0bcc5d3-0eb0-4ee4-9309-d9e8cccf972cn%40googlegroups.com.

Reply via email to