inset-animation 0.9.0

Animation controllers and curves for Inset
Documentation
# inset-animation/src
Flutter home: packages/flutter/lib/src/animation
Ported against: ed2132410ee94b5a590cb7f67cee7a6ea9101a60

## animation.rs → animation.dart

- Change: `AnyAnimation::value` hands back an owned `T`, and an animation is not a foundation `ValueListenable`.
  Reason: language — an animation may compute its value on read (`CurvedAnimation`), so there is no stored field to borrow.
  Affect: an animation cannot be handed to anything that wants a `ValueListenable`.

- Change: an `AnimationStatusListener` is matched by identity, not by the closure it holds.
  Reason: language — a Rust closure has no identity and a named function has no stable address.
  Affect: removing with a freshly built closure removes nothing, and the listener keeps firing.

## listener_helpers.rs → listener_helpers.dart

- Change: a panicking listener ends the notification.
  Reason: language — Rust has no catchable exception for ordinary control flow.
  Affect: listeners after a panicking one are skipped.

## tween.rs → tween.dart

- Change: `Tween<T>` interpolates through a `TweenLerp` trait rather than `T`'s `+` / `-` / `*`.
  Reason: language — Rust cannot dispatch those operators on an open `T` at runtime.
  Affect: a type without the impl is rejected before the program runs, where Dart throws "Cannot lerp" on the first tick.

## animations.rs → animations.dart

- Change: `AnimationMax` and `AnimationMin` combine `f64` animations only.
  Reason: language — Rust has no numeric trait spanning `i64` and `f64`.
  Affect: an integer-valued max or min has nothing to instantiate.

## animation_controller.rs → animation_controller.dart

- Change: the running simulation is shared, not owned by the controller.
  Reason: language — the tick hands `&mut App` to listeners while evaluating the simulation, and a borrow of the slot cannot survive that.
  Affect: a simulation keeps the tolerance it carried when it was passed in; nothing adjusts it afterwards.

## animation_style.rs → animation_style.dart

- Change: curve fields compare by identity; `_LerpedCurve`'s structural `==` is not reproduced.
  Reason: language — `dyn Curve` has no `PartialEq`, and no public `Curve` overrides `==`.
  Affect: two styles produced by `AnimationStyle::lerp` compare unequal even when their lerped curves are structurally equal.

## curves.rs → curves.dart

- Change: each named curve (`Curves::ease_in()`) is a clone of one process-wide instance.
  Reason: language — no const canonicalization.
  Affect: an inline `Cubic::new(0.42, 0.0, 1.0, 1.0)` is a different curve from `Curves::ease_in()` wherever curves are compared.

## Deferred

- `AnimationBehavior`'s animations-disabled path (the 0.05 duration and 200.0 fling-velocity scales). Trigger: accessibility; do not stub the binding.
- `Animation.fromValueListenable`. Trigger: first consumer; it stores a `ValueListenable` as a value.
- The `Curve2D` family (`ParametricCurve`, `CatmullRomSpline`, `CatmullRomCurve`). Trigger: a source for `dart:math`'s `Random`, which sample placement needs.
- `debugLabel`, `toString`, `toStringDetails`. Trigger: App-aware `Debug`.