Hi Michal

It's not about saving keystrokes. It's about readability, clarity and 
intent of purpose.

You could make the same argument for  `List.first(x)`. Why use that when we 
already have `Enum.at(x, 0)` ?

On Wednesday, April 26, 2017 at 7:36:49 AM UTC+1, Michał Muskała wrote:
>
> Proposed Enum.one(x) is exactly the same as Enum.at(x, 0). I'm not sure 
> it's worth it intruding a new function just to shave off 2 characters.
>
> Michał.
>
> On 26 Apr 2017, 07:26 +0200, Sam Davies <[email protected] <javascript:>>, 
> wrote:
>
> Compare these two:
>
> `hd Enum.take(collection, 1)` or `collection |> Enum.take(1) |> Enum.at(0)`
>
> and this:
>
> `Enum.one(collection)`
>
> The second seems more readable to me and its purpose is more clear than 
> either of the first two options.
>
> On Tuesday, April 25, 2017 at 11:30:02 PM UTC+1, Amos King wrote: 
>>
>> "Sins of the father." - I prefer consistency to having `take` return two 
>> different result types. 
>>
>> I think that `Enum.one\2` is a much better idea. I expect the second 
>> argument to default to nil and allow a default to be passed in.
>>
>> There is a difference between verbose and explicit. Ruby's each is still 
>> explicit, but doesn't include the verbosity of a C for loop. I think 
>> abstractions are fine, and we should consider each one carefully. We need 
>> to think about their uses and if it should be in the core, an external 
>> library, or the code using it. Anything that makes it into the core must be 
>> maintained in the core. In thinking through this like the explicitness of 
>> the name, but it doesn't buy much more than utilizing `Enum.take\2`.
>>
>> Amos King 
>> Owner
>> Binary Noggin
>> http://binarynoggin.com #business
>> http://thisagilelife.com #podcast
>>
>> =======================================================
>> I welcome VSRE emails. Learn more at http://vsre.info/
>> =======================================================
>>
>>
>> On Tue, Apr 25, 2017 at 4:06 PM, Sam Davies <[email protected]> wrote:
>>
>>> I like `Enum.one/1`. Agree that it's confusing to have `take/1` return a 
>>> single element and `take/2` returning a list, although Rails' `take` works 
>>> like this.
>>>
>>> If the collection is empty it returns nil naturally. A bang and non-bang 
>>> version could work, this would make it work like Ecto's `one/2` 
>>> function. <https://hexdocs.pm/ecto/Ecto.Repo.html#c:one/2>
>>>
>>> As for keeping things explicit, if we wanted to be explicit we'd still 
>>> be writing for loops in C ;). I like abstractions and a rich set of 
>>> functions in the standard library, where it makes sense and doesn't 
>>> duplicate functionality. 
>>>
>>>
>>> On Sunday, April 23, 2017 at 5:23:38 PM UTC+1, Matt Jadczak wrote: 
>>>>
>>>> I don't think this is needed, but as far as naming suggestions go, 
>>>> perhaps `Enum.one/1` would work, as it both indicates that a single 
>>>> element 
>>>> is returned, and doesn't necessarily imply ordering like `first` would. 
>>>> However, what happens when the Enum is empty? Do we need a bang and 
>>>> non-bang version? As others have said, I think that keeping this explicit 
>>>> is nicer. You can always add a private helper or a function to a 
>>>> project-level utility module if you use this often.
>>>>
>>>> On Saturday, 22 April 2017 18:49:10 UTC+1, Myron Marston wrote: 
>>>>>
>>>>> I don't think this would improve Elixir.  Elixir favors explicitness 
>>>>> over implicitness and fewer keystrokes and the only argument for this 
>>>>> seems 
>>>>> to be convenience. 
>>>>>
>>>>> More worrying, `Enum.take/2` returns a list of items.  If there was an 
>>>>> `Enum.take/1`, I'd expect it to simply default the number of items taken, 
>>>>> but to still return a list (even if it's just a list of one item).  But 
>>>>> from this thread it sounds like you're wanting an `Enum.take/1` that 
>>>>> returns just the first item without it being wrapped in a list.  IMO, 
>>>>> that 
>>>>> would be incredibly confusing.  It would lead to different behavior for 
>>>>> `&Enum.take/1` and `&Enum.take(&1, 1)` which would be very 
>>>>> counter-intuitive.
>>>>>
>>>>> Myron
>>>>>
>>>>> On Saturday, April 22, 2017 at 7:10:27 AM UTC-7, Amos King wrote: 
>>>>>>
>>>>>> You want to add a default of 1 to Enum.take/2? I personally don't 
>>>>>> mind that but I think it takes away from the explicit nature of the 
>>>>>> module. 
>>>>>> I prefer explicitness if we are only saving a few keystrokes. 
>>>>>>
>>>>>> Amos King 
>>>>>> Binary Noggin
>>>>>>
>>>>>> On Apr 22, 2017, at 04:12, Sam Davies <[email protected]> wrote:
>>>>>>
>>>>>> I understand the reasoning. That's why I suggest the name `take` NOT 
>>>>>> the name `first` to make it clear there is no implied ordering.
>>>>>>
>>>>>> The use case for this is often while working in IEx. I have a 
>>>>>> collection of _somethings_ and I want to see what one _something_looks 
>>>>>> like. I don't care about ordering.
>>>>>>
>>>>>> Rails' ActiveRecord has a method called `take` which does much the 
>>>>>> same thing - there is no implied ordering, it just grabs a member using 
>>>>>> some unspecified ordering and returns it.
>>>>>>
>>>>>> We already have `take/1` which returns the "first" X elements, so it 
>>>>>> seems logical to me to extend that to `take/0` which returns the "first" 
>>>>>> ONE element.
>>>>>>
>>>>>> On Thursday, April 20, 2017 at 5:55:22 PM UTC+1, Allen Madsen wrote: 
>>>>>>>
>>>>>>> Also hd, which takes the head of the list.
>>>>>>>
>>>>>>> Allen Madsen
>>>>>>> http://www.allenmadsen.com
>>>>>>>
>>>>>>> On Thu, Apr 20, 2017 at 12:44 PM, OvermindDL1 <[email protected]> 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Two things: 
>>>>>>>> 1. The `List` module already has a `List.first/1`.
>>>>>>>> 2. Not all enumerables have a concept of ordering, like a map, so 
>>>>>>>> I'm not sure an Enum version of such a thing makes conceptual sense?
>>>>>>>>
>>>>>>>> On Thursday, April 20, 2017 at 10:33:11 AM UTC-6, Sam Davies wrote: 
>>>>>>>>>
>>>>>>>>> When working with collections it's often convenient to grab the 
>>>>>>>>> first element that comes to hand. I find myself writing this a lot:
>>>>>>>>>
>>>>>>>>> `Enum.take(collection, 1)` or `Enum.at(collection, 0)`
>>>>>>>>>
>>>>>>>>> How about a function `Enum.take/1` which takes only the collection 
>>>>>>>>> and returns the "first" value (I avoid naming it `Enum.first/1` since 
>>>>>>>>> some 
>>>>>>>>> collections may not have any concept of ordering).
>>>>>>>>>
>>>>>>>> --
>>>>>>>> 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/69a0953e-07b3-4cc6-8cc0-bee718337ea5%40googlegroups.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/69a0953e-07b3-4cc6-8cc0-bee718337ea5%40googlegroups.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/bd395d6b-e64d-41ef-970e-8ac33c0e279c%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/bd395d6b-e64d-41ef-970e-8ac33c0e279c%40googlegroups.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/9123abef-0f2a-47a8-8e93-69626f9515b2%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/9123abef-0f2a-47a8-8e93-69626f9515b2%40googlegroups.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/d0ca1a3f-56e4-430b-9ed7-80d225f4d01f%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/elixir-lang-core/d0ca1a3f-56e4-430b-9ed7-80d225f4d01f%40googlegroups.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/283652cc-7ca8-42f0-b101-c48159759d66%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to