shouldBreak function

int shouldBreak(
  1. int start,
  2. List<int> mid,
  3. int end
)

Implementation

int shouldBreak(int start, List<int> mid, int end) {
  final all = [start];
  all.addAll(mid);
  all.addAll([end]);
  final previous = all[all.length - 2];
  final next = end;
  final eModifierIndex = all.lastIndexOf(eModifier);
  if (eModifierIndex > 1 &&
      all.sublist(1, eModifierIndex).every((c) => c == extend) &&
      ![extend, eBase, eBaseGaz].contains(start)) {
    return break_;
  }
  var rIIndex = all.lastIndexOf(regionalIndicator);
  if (rIIndex > 0 &&
      all.sublist(1, rIIndex).every((c) => c == regionalIndicator) &&
      ![prepend, regionalIndicator].contains(previous)) {
    if (all.where((c) => c == regionalIndicator).length % 2 == 1) {
      return breakLastRegional;
    } else {
      return breakPenultimateRegional;
    }
  }
  if (previous == cr && next == lf) {
    return notBreak;
  } else if (previous == control || previous == cr || previous == lf) {
    if (next == eModifier && mid.every((c) => c == extend)) {
      return break_;
    } else {
      return breakStart;
    }
  } else if (next == control || next == cr || next == lf) {
    return breakStart;
  } else if (previous == l &&
      (next == l || next == v || next == lv || next == lvt)) {
    return notBreak;
  } else if ((previous == lv || previous == v) && (next == v || next == t)) {
    return notBreak;
  } else if ((previous == lvt || previous == t) && next == t) {
    return notBreak;
  } else if (next == extend || next == zwj) {
    return notBreak;
  } else if (next == spacingMark) {
    return notBreak;
  } else if (previous == prepend) {
    return notBreak;
  }
  final previousNonExtendIndex =
      all.contains(extend) ? all.lastIndexOf(extend) - 1 : all.length - 2;
  if (previousNonExtendIndex != -1 &&
      [eBase, eBaseGaz].contains(all[previousNonExtendIndex]) &&
      all.length > previousNonExtendIndex + 1 &&
      sliceFromEnd(all, previousNonExtendIndex + 1).every((c) => c == extend) &&
      next == eModifier) {
    return notBreak;
  }
  if (previous == zwj && [glueAfterZwj, eBaseGaz].contains(next)) {
    return notBreak;
  }
  if (mid.contains(regionalIndicator)) {
    return break_;
  }
  if (previous == regionalIndicator && next == regionalIndicator) {
    return notBreak;
  }
  return breakStart;
}