    */
   associatedtype ActionType
 
+  /**
+   We use tuple since SomeStruct<A, B> as? SomeStruct<A, Any> always fails,
+   but (A, B) as? (A, Any) succeeds.
+   */
   typealias ReduceTuple = (state: StateType, action: ActionType, modified: Bool)
   typealias ReduceFunction = (ReduceTuple) -> ReduceTuple
 }


extension ReducerType {
  func reduce(_ tuple: ActionTypeErasedReduceTuple) -> ActionTypeErasedReduceTuple {
    guard let typedTuple = tuple as? ReduceTuple else {
      return tuple
    }

    let typedResult = self.typedReduce(typedTuple)
    return (state: typedResult.state, action: typedResult.action, modified: typedResult.modified)

  convenience init(
    initialState: ReduxTypes.StateType,
    reducers: [ReduxTypes.ReduceFunction],
    middlewares: [(@escaping ReduxTypes.ReduceFunction) -> ReduxTypes.ReduceFunction] = []
  ) {
    self.init(initialState: initialState)

