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
19 stars 9 forks source link

More List.minimum/maximum simplifications #306

Open jfmengels opened 5 months ago

jfmengels commented 5 months ago
List.minimum [ 1, 2, 3 ]
--> Just 1
List.minimum (1 :: [ 2, 3 ])
--> Just 1

List.maximum [ 1, 2, 3 ]
--> Just 3

List.minimum [ a, 1 ]
-- Not reported, but if there are duplicate values, then we can remove some of them
List.minimum [ 3, a, 1 ]
--> List.minimum [ a, 1 ]
List.minimum (3 :: list ++ [5])
--> List.minimum (3 :: list)
List.minimum ([3] ++ list ++ [5])
--> List.minimum ([3] ++ list)

List.minimum (List.repeat <positiveInt> x)
--> Just x
List.maximum (List.repeat <positiveInt> x)
--> Just x

If we know x <= y

List.minimum (List.range x y)
--> Just x
List.maximum (List.range x y)
--> Just y
morteako commented 5 months ago

Some more

-- known n
-- same for maximum
List.minimum (List.repeat n x) 
--> Just x -- if n > 0
--> Nothing -- if n <= 0, Already implemented (see comment below)

-- unknown n
-- same for maximum
List.minimum (List.repeat n x) 
--> if n > 0 then Just x else Nothing

-- same for maximum
List.minimum (List.reverse list)
--> List.minimum list

-- same for maximum, sortBy f, sortWith f
List.minimum (List.sort list)
--> List.minimum list
lue-bird commented 5 months ago

The minimum << reverse = minimum doesn't work for these pesky NaNs:

✗ minimum = reverse minimum

Given [(0,0),(NaN,0)]

    "Just (0,0)"
    ╷
    │ Expect.equal
    ╵
    "Just (NaN,0)"

running the test

Test.fuzz (Fuzz.list (Fuzz.pair Fuzz.float Fuzz.int))
    "minimum = reverse minimum"
    (\comparables ->
        (comparables |> List.minimum |> Debug.toString)
            |> Expect.equal
                (comparables |> List.reverse |> List.minimum |> Debug.toString)
    )