// 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 'chain.dart';
import 'frame.dart';
import 'lazy_trace.dart';
import 'trace.dart';

/// A thunk for lazily constructing a [Chain].
typedef ChainThunk = Chain Function();

/// A wrapper around a [ChainThunk]. This works around issue 9579 by avoiding
/// the conversion of native [StackTrace]s to strings until it's absolutely
/// necessary.
class LazyChain implements Chain {
  final ChainThunk _thunk;
  Chain _inner;

  LazyChain(this._thunk);

  Chain get _chain => _inner ??= _thunk();

  @override
  List<Trace> get traces => _chain.traces;
  @override
  Chain get terse => _chain.terse;
  @override
  Chain foldFrames(bool Function(Frame) predicate, {bool terse = false}) =>
      LazyChain(() => _chain.foldFrames(predicate, terse: terse));
  @override
  Trace toTrace() => LazyTrace(() => _chain.toTrace());
  @override
  String toString() => _chain.toString();
}
