jfmengels / elm-review-simplify

Provides elm-review rules to simplify your Elm code
https://package.elm-lang.org/packages/jfmengels/elm-review-simplify/latest/
BSD 3-Clause "New" or "Revised" License
20 stars 9 forks source link

More simplifications for List.take and List.drop #268

Open morteako opened 9 months ago

morteako commented 9 months ago

More simplifications for List.take and List.drop

Some suggestions for List.take and List.drop simplifications. I think take and map are functions that are used a lot, so new rules would probably be applied in many codebases 🚀

(n is refering to the Int argument , as in List.take n list)

List.drop with negative n - ✅ #270

List.drop -1 list
--> list

Literal lists with size <= n (drop: ✅ #270)

List.take 5 [a,b,c]
--> [a,b,c]

List.drop 5 [a,b,c]
--> []

List.take 1 (List.singleton x)
--> List.singleton x

List.drop 1 (List.singleton x)
--> []

List.repeat with non-negative n <= repeat arg

List.take 3 (List.repeat 5 x)
--> List.repeat 3 x

List.drop 3 (List.repeat 5 x)
--> List.drop 2 x

List.range with size >= n

List.take 3 (List.range 0 10)
--> List.range 0 2

List.drop 3 (List.range 0 10)
--> List.range 3 10

Generalization question

Some of these can be generalized more, f.ex.

-- n > 0
List.drop n (List.repeat m x)
--> List.repeat (m - Basics.max 0 n) x

But I am not sure about the clarity of the resulting code and also about how it will impact further simplifications. So I went with the simpler one. Open for suggestions


Feedback and tips welcome! And of course more suggestions and corrections.

I can probably look into implementing most of these myself.

lue-bird commented 9 months ago

Nice.

Other than those nitpicks, looks good!

morteako commented 9 months ago
  • List.length (List.take 10 list)
    --> 10

    doesn't work because list can have less than 10 elements.

Yes, of course. My bad. This was a bit of a hasty late suggestion. Removed

Fixed! Thanks

jfmengels commented 9 months ago

Nice suggestions :+1:

Other things we could do:

List.drop 2 (x :: y :: z :: list)
--> z :: list

List.drop 2 (x :: list)
--> List.drop 1 list

List.take 2 (x :: list)
--> x :: List.take 1 list

@morteako Would you like to work on these simplifications? Asking before @lue-bird snatches them away :sweat_smile:

morteako commented 9 months ago

@jfmengels I will at least take a look at the first one , and try to include

List.drop 2 ([x,y,z] ++ list)
--> z :: list

I am not personally sure about

List.take 2 (x :: list)
--> x :: List.take 1 list

It should be better for performance, but i think maybe the resulting code is a bit more unclear.