 
     return {
       animationKeys.forEach { observer.coreAnimation?(.remove($0)) }
+      animationKeys.removeAll()
+      activeAnimations.removeAll()
+
+      lastValues = nil
+      lastKeyPositions = nil
       activeSubscription.unsubscribe()
+      valuesSubscription.unsubscribe()
+      keyPositionsSubscription.unsubscribe()
     }
   }
 }

      animationKeys.append(key)
    }

    let activeSubscription = tween.enabled.dedupe().subscribeToValue { enabled in
      if enabled {
        checkAndEmit()


    var animationKeys: [String] = []
    var activeAnimations = Set<String>()
    var lastValues: [T]?
    var lastKeyPositions: [CGFloat]?

    let checkAndEmit = {
      guard let values = lastValues, let keyPositions = lastKeyPositions, tween.enabled.value else {
        return
      }
      let animation: CAPropertyAnimation
      let timingFunctions = tween.timingFunctions
      if values.count > 1 {
        let keyframeAnimation = CAKeyframeAnimation()
        keyframeAnimation.values = values
        keyframeAnimation.keyTimes = keyPositions.map { NSNumber(value: Double($0)) }
        keyframeAnimation.timingFunctions = timingFunctions.value
        animation = keyframeAnimation
      } else {
        let basicAnimation = CABasicAnimation()
        basicAnimation.toValue = values.last
        basicAnimation.timingFunction = timingFunctions.value.first
        animation = basicAnimation
      }
      observer.next(values.last!)

      guard let duration = tween.duration._read() else {
        return
