The more general construct here would be a tee
<https://en.wikipedia.org/wiki/Tee_(command)>:

["thing1", "thing2"]
|> generate_more_things()
|> IO.inspect(transform: &length/1)
|> do_something_with_things()


could be written as:


["thing1", "thing2"]
|> generate_more_things()
|> tee(&IO.inspect(length(&1))
|> do_something_with_things()


Note IO.inspect is already a tee.

*José Valimwww.plataformatec.com.br
<http://www.plataformatec.com.br/>Founder and Director of R&D*

On Mon, Jan 15, 2018 at 10:14 PM, Martin Svalin <[email protected]>
wrote:

> `map` would have the connotation of applying a function to all elements of
> a collection. `apply` would more directly have the connotation of running a
> function with some arguments.
>
> `IO.inspect(value, apply: &length/1)`
>
> I like the idea of being able to narrow down what I'm inspecting during
> the print-debugging workflow I inevitably regress to. `nested_structure |>
> IO.inspect(apply: & get_in(&1, [:foo, :bar, :baz]))`. Thumbs up for the
> idea.
>
> mån 15 jan. 2018 kl 17:31 skrev Marcus Gartner <[email protected]>:
>
>> Doh! I should have realized the issue with executing the function passed.
>>
>> I like the idea of a transform option that can be passed.
>>
>> IO.map makes sense in my example, but wouldn't make sense to me if the
>> pipeline wasn't dealing with an enumerable, and it would be nice if this
>> feature was general enough to work idiomatically with any possible values.
>>
>> On Sat, Jan 13, 2018 at 7:38 PM OvermindDL1 <[email protected]>
>> wrote:
>>
>>> Or call it `map` as it's shorter and perfectly descriptive.  I've made a
>>> few variants of this myself and I'd love it built into IO.inspect.
>>>
>>> On Jan 12, 2018 16:31, "Greg Vaughn" <[email protected]> wrote:
>>>
>>>> I like the original idea and would like to suggest another approach.
>>>> What if there were an additional Inspect.Opts of :transform? It then would
>>>> enable this sort of thing:
>>>>
>>>> ["thing1", "thing2"]
>>>> |> generate_more_things()
>>>> |> IO.inspect(transform: &length/1)
>>>> |> do_something_with_things()
>>>>
>>>> -Greg Vaughn
>>>>
>>>> > On Jan 12, 2018, at 5:18 PM, José Valim <[email protected]> wrote:
>>>> >
>>>> > Thanks for the proposal!
>>>> >
>>>> > Unfortunately that would make us unable to inspect functions
>>>> themselves, which is a valid argument to IO.inspect after all.
>>>> >
>>>> > Imagine the confusion of trying to inspect a pipeline that may emit
>>>> an anonymous function only to find it is being executed instead.
>>>> >
>>>> >
>>>> >
>>>> > José Valim
>>>> > www.plataformatec.com.br
>>>> > Founder and Director of R&D
>>>> >
>>>> > On Fri, Jan 12, 2018 at 10:59 PM, <[email protected]> wrote:
>>>> > I often find myself wanting to inspect things in the middle of a
>>>> chain of pipes, but I don’t always want to inspect the return values as-is.
>>>> Sometimes I want to inspect sub-attributes or call functions on the return
>>>> values to inspect them.
>>>> >
>>>> > For example, imagine the contrived pipeline below.
>>>> >
>>>> > ["thing1", "thing2"]
>>>> > |> generate_more_things()
>>>> > |> do_something_with_things()
>>>> >
>>>> > If I want to know the length of the list returned by
>>>> generate_more_things/1, I would do this:
>>>> >
>>>> > ["thing1", "thing2"]
>>>> > |> generate_more_things()
>>>> > |> (fn things ->
>>>> >   things |> length() |> IO.inspect()
>>>> >   things
>>>> > end).()
>>>> > |> do_something_with_things()
>>>> >
>>>> > If IO.inspect can take a function as an argument, print the
>>>> inspection of the result of calling that function, but still return the
>>>> un-altered input, I could do this:
>>>> >
>>>> > ["thing1", "thing2"]
>>>> > |> generate_more_things()
>>>> > |> IO.inspect(fn things -> length(things) end)
>>>> > |> do_something_with_things()
>>>> >
>>>> > Or even:
>>>> >
>>>> > ["thing1", "thing2"]
>>>> > |> generate_more_things()
>>>> > |> IO.inspect(&length/1)
>>>> > |> do_something_with_things()
>>>> >
>>>> > I think this would aid during debugging and be a useful feature in
>>>> the standard library. I'd love to implement and contribute on this, but I
>>>> wanted to see if such a thing would be accepted before beginning work.
>>>> >
>>>> > Open to feedback!
>>>> >
>>>> > --
>>>> > 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 [email protected].
>>>> > To view this discussion on the web visit https://groups.google.com/d/
>>>> msgid/elixir-lang-core/4e2bfad0-b745-4059-8736-
>>>> 996e641c7bb2%40googlegroups.com.
>>>> > For more options, visit https://groups.google.com/d/optout.
>>>> >
>>>> >
>>>> > --
>>>> > 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 [email protected].
>>>> > To view this discussion on the web visit https://groups.google.com/d/
>>>> msgid/elixir-lang-core/CAGnRm4KAvw%2BwWnh7d60%3DvKEkuLvWfyoh4XuM9rbuxz_
>>>> CaLg9%3DA%40mail.gmail.com.
>>>> > For more options, visit https://groups.google.com/d/optout.
>>>>
>>>> --
>>>> 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 [email protected].
>>>>
>>> To view this discussion on the web visit https://groups.google.com/d/
>>>> msgid/elixir-lang-core/6CF01F3F-5848-4E19-BCA1-9D256824D6E0%40gmail.com
>>>> .
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> --
>>>
>> You received this message because you are subscribed to a topic in the
>>> Google Groups "elixir-lang-core" group.
>>> To unsubscribe from this topic, visit https://groups.google.com/d/
>>> topic/elixir-lang-core/TUkmNHI4IbI/unsubscribe.
>>> To unsubscribe from this group and all its topics, send an email to
>>> [email protected].
>>
>>
>>> To view this discussion on the web visit https://groups.google.com/d/
>>> msgid/elixir-lang-core/CAJhqboH_tYYRPFWf8HuVJru5phmOmU7tK_
>>> PDWVca36mUfWhJ8Q%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAJhqboH_tYYRPFWf8HuVJru5phmOmU7tK_PDWVca36mUfWhJ8Q%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>> --
>> 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 [email protected].
>> To view this discussion on the web visit https://groups.google.com/d/
>> msgid/elixir-lang-core/CAONCvEwH7a8GzHtQb78gGo0H95BJV
>> xq8KPAcvGy3cZKYXr9nGA%40mail.gmail.com
>> <https://groups.google.com/d/msgid/elixir-lang-core/CAONCvEwH7a8GzHtQb78gGo0H95BJVxq8KPAcvGy3cZKYXr9nGA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
> --
> 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 [email protected].
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/elixir-lang-core/CAAHw6CLuxuNsnk-JWCTPtCr4_
> fsQG13eUQC3ajW5Ca2LkWwdLQ%40mail.gmail.com
> <https://groups.google.com/d/msgid/elixir-lang-core/CAAHw6CLuxuNsnk-JWCTPtCr4_fsQG13eUQC3ajW5Ca2LkWwdLQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Ji7kAjv5i4_04AVp-hae4ghj1DgZx1zr%2B4LyGBYpj5_A%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to