anchor.diff:      TextEditingValue newValue,
     ) {
       return _selectionAwareTextManipulation(
  -      newValue, 
  +      newValue,
         (String substring) {
           return whitelistedPattern
               .allMatches(substring)
  
positive.code: ///    characters.
  abstract class TextInputFormatter {
    /// Called when text is being typed or cut/copy/pasted in the [EditableText].
    /// 
    /// You can override the resulting text based on the previous text value and
    /// the incoming new text value.
    /// 
    /// When formatters are chained, `oldValue` reflects the initial value of
    /// [TextEditingValue] at the beginning of the chain.
    TextEditingValue formatEditUpdate(
      TextEditingValue oldValue, 
      TextEditingValue newValue
    );
  
  
negative.code:   }
  }
  
  /// Function signature expected for creating custom [TextInputFormatter]
  /// shorthands via [TextInputFormatter.withFunction];
  typedef TextEditingValue TextInputFormatFunction(
      TextEditingValue oldValue,
      TextEditingValue newValue,
  );
  
  /// Wiring for [TextInputFormatter.withFunction].
  class _SimpleTextInputFormatter extends TextInputFormatter {
    _SimpleTextInputFormatter(this.formatFunction) :
      assert(formatFunction != null);
  
    final TextInputFormatFunction formatFunction;
  
    @override
    TextEditingValue formatEditUpdate(
      TextEditingValue oldValue,
      TextEditingValue newValue
    ) {
      return formatFunction(oldValue, newValue);
    }
  }
  
  /// A [TextInputFormatter] that prevents the insertion of blacklisted
  /// characters patterns.
  ///
  /// Instances of blacklisted characters found in the new [TextEditingValue]s
  /// will be replaced with the [replacementString] which defaults to the empty
  /// string.
  ///
  /// Since this formatter only removes characters from the text, it attempts to
  /// preserve the existing [TextEditingValue.selection] to values it would now
  /// fall at with the removed characters.
  ///
  /// See also:
  ///
  ///  * [WhitelistingTextInputFormatter], which uses a whitelist instead of a
  ///    blacklist.
  class BlacklistingTextInputFormatter extends TextInputFormatter {
    /// Creates a formatter that prevents the insertion of blacklisted characters patterns.
    ///
    /// The [blacklistedPattern] must not be null.
    BlacklistingTextInputFormatter(
      this.blacklistedPattern, {
      this.replacementString: '',
    }) : assert(blacklistedPattern != null);
  
    /// A [Pattern] to match and replace incoming [TextEditingValue]s.
    final Pattern blacklistedPattern;
  