Возвращаемые значения

В библиотеке Popmotion почти каждая функция анимации, трансформации или композиции возвращает не примитивное значение, а управляемый объект или функцию управления жизненным циклом процесса. Такой подход формирует единый контракт взаимодействия: результат вызова всегда содержит инструменты для наблюдения, остановки, изменения или композиции поведения.

Архитектура возвращаемых значений строится вокруг принципа управляемых потоков (streams) и контролируемых анимационных процессов, где результат — это не конечное состояние, а интерфейс управления состоянием во времени.


Контроллеры анимации как возвращаемый результат

Основные функции создания анимаций — animate, tween, spring, keyframes, physics — возвращают контроллеры. Эти контроллеры представляют собой объекты с методами управления жизненным циклом.

Базовая структура контроллера

Типичный контроллер содержит следующие возможности:

  • запуск и остановка анимации
  • подписка на изменения состояния
  • получение текущего значения
  • проверка состояния выполнения

Обобщённая форма:

const animation = animate({
  from: 0,
  to: 100,
  duration: 1000
});

Возвращаемый объект содержит управление процессом:

animation.stop();
animation.play?.();
animation.isRunning?.();

Различия между конкретными реализациями проявляются в наборе доступных методов, однако общая идея остаётся неизменной: возвращается не значение, а управляемый процесс.


Возвращаемые значения animate

Функция animate формирует низкоуровневый контроллер, ориентированный на унифицированное управление временем.

Возвращаемый объект обычно содержит:

  • stop() — немедленная остановка
  • pause() — приостановка (в зависимости от конфигурации)
  • finish() — завершение на конечном значении
  • then() — интеграция с Promise-подобной моделью (в некоторых реализациях)
  • subscribe() — наблюдение за значениями
const controls = animate({
  from: 0,
  to: 200,
  duration: 500,
  onUpdate: (v) => console.log(v)
});

controls выступает как единая точка управления потоком анимации.

Особенность заключается в том, что результат выполнения не отделён от управления: управление встроено в возвращаемый объект.


Возвращаемые значения tween

tween возвращает более декларативный контроллер, ориентированный на интерполяцию между состояниями.

const tweenAnimation = tween({
  from: { x: 0 },
  to: { x: 300 },
  duration: 800
});

Возвращаемый объект обычно поддерживает:

  • управление временем (play, stop)
  • подписку на промежуточные значения
  • доступ к прогрессу

Особенность tween-контроллера заключается в том, что возвращаемое значение всегда является результатом интерполяции структуры данных, а не только числа.


Возвращаемые значения spring

spring возвращает контроллер физической модели. В отличие от tween, результат не привязан к фиксированной длительности.

const springAnimation = spring({
  from: 0,
  to: 100,
  stiffness: 120,
  damping: 17
});

Возвращаемый объект отражает состояние физической системы:

  • текущая позиция
  • скорость
  • возможность досрочной стабилизации
  • остановка при достижении равновесия

Контроллер в данном случае является отражением внутреннего симуляционного цикла.


Подписка как возвращаемое значение

Механизм subscribe в Popmotion является фундаментальной частью модели возвратов. Подписка всегда возвращает функцию отписки.

const subscription = springAnimation.subscribe((v) => {
  console.log(v);
});

Возвращаемое значение:

  • функция прекращения подписки
  • управление утечками памяти
  • контроль жизненного цикла слушателя
subscription();

Такая модель делает управление потоками данных симметричным: регистрация и отмена всегда представлены в одном интерфейсе.


Возвращаемые значения value

Функция value создаёт реактивную сущность, представляющую изменяемое состояние.

const x = value(0);

Возвращаемый объект содержит:

  • get() — получение текущего значения
  • set() — установка нового значения
  • upd ate() — функциональное обновление
  • subscribe() — наблюдение
x.se t(10);
console.log(x.get());

Особенность заключается в том, что значение инкапсулировано внутри объекта, а не существует как примитивная переменная. Это создаёт реактивную оболочку вокруг состояния.


Возвращаемые значения композиционных функций

pipe

Функция pipe возвращает новую функцию, являющуюся результатом композиции.

const transform = pipe(
  (v) => v * 2,
  (v) => v + 10
);

Возвращаемое значение:

  • функция трансформации входных данных
  • цепочка чистых преобразований
transform(5); // 20

compose (аналогичные паттерны)

В композиционных утилитах возвращаемым значением также всегда является функция, а не вычисленный результат.

Это создаёт ленивую модель вычислений, где результат формируется только при вызове.


Возвращаемые значения временных последовательностей

timeline

timeline возвращает контроллер последовательности анимаций.

const sequence = timeline([
  [animate({ from: 0, to: 50 })],
  [animate({ from: 50, to: 100 })]
]);

Возвращаемый объект:

  • управление всей последовательностью
  • возможность остановки цепочки
  • наблюдение за общим прогрессом

Особенность заключается в агрегировании множества контроллеров в один управляющий слой.


Общая модель возвратов

Во всех функциях Popmotion прослеживается единый паттерн:

1. Возврат управления вместо значения

Результатом почти всегда является объект управления:

  • контроллер анимации
  • функция отписки
  • функция преобразования
  • реактивная обёртка

2. Инкапсуляция состояния

Состояние не возвращается напрямую, а доступно через:

  • методы (get, set)
  • подписки (subscribe)
  • события обновления

3. Симметрия управления

Каждый возврат имеет обратный механизм:

  • subscribe ↔︎ unsubscribe-функция
  • animate ↔︎ stop
  • value.set ↔︎ value.get
  • композиция ↔︎ вызов результата

Типизация возвращаемых значений

Внутренняя модель возвратов может быть обобщена через несколько категорий:

Контроллеры анимации

  • AnimationControls
  • SpringControls
  • TweenControls

Реактивные значения

  • MotionValue
  • StateContainer

Функциональные возвраты

  • композиции
  • преобразования
  • цепочки вычислений

Поведение возвращаемых объектов во времени

Возвращаемые объекты Popmotion существуют не статично, а как временные сущности:

  • обновляются на каждом кадре
  • реагируют на внешние события
  • могут быть остановлены или пересозданы

Контроллер становится активным процессом, а не структурой данных.


Делегирование управления через возврат

Возвращаемые значения выполняют роль делегатов управления. Вместо прямого изменения внутреннего состояния библиотеки, весь контроль осуществляется через интерфейс, полученный при вызове функции.

Это приводит к модели, где:

  • функция создаёт процесс
  • возвращаемый объект управляет процессом
  • внешняя среда взаимодействует только через этот объект

Асинхронная природа возвратов

Несмотря на отсутствие обязательного использования Promise, многие возвращаемые значения обладают асинхронным поведением:

  • обновления происходят по кадрам
  • завершение наступает позже вызова
  • состояние изменяется во времени

Это делает возвращаемые объекты временными потоками данных, а не мгновенными результатами вычислений.


Управление жизненным циклом через возвращаемые значения

Каждый возвращаемый объект связан с жизненным циклом:

  • инициализация при вызове функции
  • активная фаза обновлений
  • завершение или остановка
  • освобождение ресурсов

Контроль этого цикла полностью делегирован возвращаемому значению, что устраняет необходимость внешнего менеджмента состояния.