485c8a5999
Add IterableMixin and IterableBase to dart:collection. For now, the implementation is duplicated, because mixins and const constructors don't mix. We hope that mixins will be improved in the future to allow using the mixin to define the base class. Review URL: https://codereview.chromium.org//14022007 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@21457 260f80e4-7a28-3924-810f-c04153c831b5
47 lines
1.1 KiB
Dart
47 lines
1.1 KiB
Dart
// Copyright (c) 2012, 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.
|
|
// VMOptions=--enable_checked_mode
|
|
|
|
import "dart:collection";
|
|
|
|
abstract class Link<T> extends IterableBase<T> {
|
|
factory Link(T head, [Link<T> tail]) = LinkEntry<T>;
|
|
Link<T> prepend(T element);
|
|
}
|
|
|
|
abstract class EmptyLink<T> extends Link<T> {
|
|
const factory EmptyLink() = LinkTail<T>;
|
|
}
|
|
|
|
class AbstractLink<T> implements Link<T> {
|
|
const AbstractLink();
|
|
Link<T> prepend(T element) {
|
|
print("$element");
|
|
if (0 is T) {
|
|
throw "0 is not a T";
|
|
}
|
|
return new Link<T>(element, this);
|
|
}
|
|
}
|
|
|
|
class LinkTail<T> extends AbstractLink<T> implements EmptyLink<T> {
|
|
const LinkTail();
|
|
}
|
|
|
|
class LinkEntry<T> extends AbstractLink<T> {
|
|
LinkEntry(T head, [Link<T> Tail]);
|
|
}
|
|
|
|
class Fisk {
|
|
Link<Fisk> nodes = const EmptyLink<Fisk>();
|
|
final int id;
|
|
Fisk(this.id);
|
|
toString() => id.toString();
|
|
}
|
|
|
|
main() {
|
|
new Fisk(0).nodes.prepend(new Fisk(1)).prepend(new Fisk(2));
|
|
}
|
|
|