I've finally gotten around to chasing down the last pair of bugs and releasing
elm-animation!
I appreciate the other animation libraries out there, especially Dan's, but let me advertise for a minute and tell you why I think my library is best.
Rather than signals or tasks, animations are just (opaque) records and pure functions that operate on them. They're run from a single running clock, which you maintain - the library doesn't try to architect your application for you. Because the clock is under your control, you can slow down animations, peek into the future or past, or pause time entirely. You can inspect animations, equate them, determine how long they've been running, their velocity, or the time elapsed. And you can undo or retarget animations to smoothly move towards new values.
From an API standpoint, every function in the library (except retarget) takes no more than two arguments. This encourages a readable pipeline style, rather than "what does that parameter do?". The docs walk you through everything you need to know to use the library.
import Animation exposing (..)
import Time exposing (second)
myAnim = animation 0 |> from 100 |> to 300 |> duration (4*second) |> delay (1*second)
List.map (\t -> animate (t*second) myAnim) [0..6]
-- [100, 100, 129.29, 200, 270.71, 300, 300]
I'm very satisfied with this release. However, if there's a feature you'd like to see, please let me know.