I have a real-life example (not for debugging). I'm actually tee function (my own trivial implementation).
Suppose you have to change some records on a Repo (using Ecto) and the send some notifications about those changes. We are doing something like this: changeset = E |> Repo.get(id) |> E.some_change() |> E.some_other_change() Repo.update!(changset) Notification.send(changeset) with the tee function we could write it like E |> Repo.get(id) |> E.some_change() |> E.some_other() |> tee(&Repo.update!/1) |> Notification.send() I think the tee function is very useful for general cases. El viernes, 19 de enero de 2018, 13:10:11 (UTC-3), Kelvin Raffael Stinghen escribió: > > It happens that the `tee/2` function was not merged to elixir core because > not too much people could bring real-life examples for using it except for > debugging. > > But for those who liked the idea and want to use the `tee/2` function, > I've created the [`plumbing`](https://github.com/kelvinst/plumbing) > package. > > On Monday, January 15, 2018 at 11:26:02 PM UTC-2, Kelvin Raffael Stinghen > wrote: >> >> The `tee/2` idea is wonderful!! This way we can use it for any function, >> not just `IO.inspect`. One word: PERFECT!!! >> >> I am opening a PR for it... >> >> Best, >> Kelvin Stinghen >> [email protected] <javascript:> >> >> On Jan 15, 2018, at 19:27, José Valim <[email protected] <javascript:>> >> wrote: >> >> 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] >> <javascript:>> 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] >>> <javascript:>>: >>> >>>> 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] >>>> <javascript:>> 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] <javascript:>> >>>>> 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] >>>>>> <javascript:>> 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] <javascript:>> >>>>>> 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] <javascript:>. >>>>>> > 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] <javascript:>. >>>>>> > 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] <javascript:>. >>>>>> >>>>> 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] <javascript:>. >>>> >>>> >>>>> 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] <javascript:>. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/elixir-lang-core/CAONCvEwH7a8GzHtQb78gGo0H95BJVxq8KPAcvGy3cZKYXr9nGA%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] <javascript:>. >>> 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] <javascript:>. >> 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 >> >> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Ji7kAjv5i4_04AVp-hae4ghj1DgZx1zr%2B4LyGBYpj5_A%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/51318921-9851-4b47-b6b3-52a2a50943b5%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
