text: /*
   * Copyright (c) Facebook, Inc. and its affiliates.
   *
   * This source code is licensed under the MIT license found in the
   * LICENSE file in the root directory of this source tree.
   */
  
  #import "RCTLayoutAnimationGroup.h"
  
  #import "RCTConvert.h"
  #import "RCTLayoutAnimation.h"
  
  @implementation RCTLayoutAnimationGroup
  
  - (instancetype)initWithCreatingLayoutAnimation:(RCTLayoutAnimation *)creatingLayoutAnimation
                          updatingLayoutAnimation:(RCTLayoutAnimation *)updatingLayoutAnimation
                          deletingLayoutAnimation:(RCTLayoutAnimation *)deletingLayoutAnimation
                                         callback:(RCTResponseSenderBlock)callback
  {
    if (self = [super init]) {
      _creatingLayoutAnimation = creatingLayoutAnimation;
      _updatingLayoutAnimation = updatingLayoutAnimation;
      _deletingLayoutAnimation = deletingLayoutAnimation;
      _callback = callback;
    }
  
    return self;
  }
  
  - (instancetype)initWithConfig:(NSDictionary *)config callback:(RCTResponseSenderBlock)callback
  {
    if (!config) {
      return nil;
    }
  
    if (self = [super init]) {
      NSTimeInterval duration = [RCTConvert NSTimeInterval:config[@"duration"]];
  
      if (duration > 0.0 && duration < 0.01) {
        RCTLogError(@"RCTLayoutAnimationGroup expects timings to be in ms, not seconds.");
        duration = duration * 1000.0;
      }
  
      _creatingLayoutAnimation = [[RCTLayoutAnimation alloc] initWithDuration:duration config:config[@"create"]];
      _updatingLayoutAnimation = [[RCTLayoutAnimation alloc] initWithDuration:duration config:config[@"update"]];
      _deletingLayoutAnimation = [[RCTLayoutAnimation alloc] initWithDuration:duration config:config[@"delete"]];
      _callback = callback;
    }
  
    return self;
  }
  
  - (BOOL)isEqual:(RCTLayoutAnimationGroup *)layoutAnimation
  {
    RCTLayoutAnimation *creatingLayoutAnimation = layoutAnimation.creatingLayoutAnimation;
    RCTLayoutAnimation *updatingLayoutAnimation = layoutAnimation.updatingLayoutAnimation;
    RCTLayoutAnimation *deletingLayoutAnimation = layoutAnimation.deletingLayoutAnimation;
  
    return (_creatingLayoutAnimation == creatingLayoutAnimation ||
            [_creatingLayoutAnimation isEqual:creatingLayoutAnimation]) &&
        (_updatingLayoutAnimation == updatingLayoutAnimation ||
         [_updatingLayoutAnimation isEqual:updatingLayoutAnimation]) &&
        (_deletingLayoutAnimation == deletingLayoutAnimation ||
         [_deletingLayoutAnimation isEqual:deletingLayoutAnimation]);
  }
  
  - (NSString *)description
  {
    return
        [NSString stringWithFormat:
                      @"<%@: %p; creatingLayoutAnimation: %@; updatingLayoutAnimation: %@; deletingLayoutAnimation: %@>",
                      NSStringFromClass([self class]),
                      self,
                      [_creatingLayoutAnimation description],
                      [_updatingLayoutAnimation description],
                      [_deletingLayoutAnimation description]];
  }
  
  @end
  