| // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import 'dart:io'; |
| |
| typedef String ItemCallBack<T>(T item); |
| |
| /// [ExtendedPrinter] provides helper and utility methods around print |
| /// functions. |
| class ExtendedPrinter { |
| String preceding; |
| final int width; |
| |
| ExtendedPrinter({this.preceding = "", this.width = 80}); |
| |
| /// Prints to stdout. All preeceding characters will be placed before. |
| void print(Object obj) { |
| stdout.write(preceding); |
| stdout.write(obj); |
| } |
| |
| /// Prints to stdout followed by a line break. All preeceding characters will |
| /// be placed before. |
| void println(Object obj) { |
| stdout.write(preceding); |
| stdout.writeln(obj); |
| } |
| |
| /// Prints a block by cutting at new lines and calls [println] for each line. |
| void printBlock(String block) { |
| block.split("\n").forEach(println); |
| } |
| |
| /// Prints the [pattern] to stdout by writing the pattern as many times it can |
| /// before width is reached. |
| void printLinePattern(String pattern) { |
| if (pattern.length == 0) { |
| stdout.writeln(); |
| } |
| stdout.writeln(pattern * (width ~/ pattern.length)); |
| } |
| |
| /// Prints an iterable while maintaining state for index and preceding. |
| void printIterable<T>(Iterable<T> items, ItemCallBack<T> cb, |
| {ItemCallBack<T> header, |
| String separatorPattern: "", |
| String itemPreceding: ""}) { |
| bool isFirst = true; |
| String previousPreceding = this.preceding; |
| items.forEach((item) { |
| if (isFirst && separatorPattern != null && separatorPattern.isNotEmpty) { |
| printLinePattern(separatorPattern); |
| } |
| if (header != null) { |
| println(header(item)); |
| } |
| this.preceding = itemPreceding; |
| printBlock(cb(item)); |
| println(""); |
| this.preceding = previousPreceding; |
| isFirst = false; |
| }); |
| } |
| } |