| abstract class HBase<HKT extends HKind> implements Kind<HKT> {} |
| |
| abstract class HKind {} |
| |
| abstract class HKindInvalid implements HKindValid {} |
| |
| abstract class HKindValid implements HKind {} |
| |
| abstract class Kind<HKT extends HKind> {} |
| |
| class HBaseChild<HKT extends HKindValid, CHILD extends HBase<HKT>> |
| implements HBase<HKT> { |
| const HBaseChild( |
| final this.child, |
| ); |
| final CHILD child; |
| } |
| |
| class HBaseComposite<HKT extends HKindValid, CHILD extends HBase<HKT>> |
| implements HBase<HKT> { |
| const HBaseComposite( |
| final this.children, |
| ); |
| final List<CHILD> children; |
| } |
| |
| class HBaseError<HKT extends HKindInvalid> implements HBase<HKT> { |
| const HBaseError( |
| final this.errorMessage, |
| ); |
| final String errorMessage; |
| } |
| |
| class HBaseLeaf<HKT extends HKindValid> implements HBase<HKT> { |
| const HBaseLeaf( |
| final this.data, |
| ); |
| final int data; |
| } |
| |
| const HInvalid invalidExample = HInvalidComposite( |
| [ |
| HInvalidLeaf(0), |
| HInvalidChild( |
| HInvalidLeaf(0), |
| ), |
| HInvalidError("error message"), |
| ], |
| ); |
| main() {} |
| typedef HInvalid = HBase<HKindInvalid>; |
| typedef HInvalidChild<CHILD extends HInvalid> = HBaseChild<HKindInvalid, CHILD>; |
| typedef HInvalidComposite<CHILD extends HInvalid> |
| = HBaseComposite<HKindInvalid, CHILD>; |
| typedef HInvalidError = HBaseError<HKindInvalid>; |
| typedef HInvalidLeaf = HBaseLeaf<HKindInvalid>; |