@@ -51,6 +51,10 @@ abstract class Code implements Spec {
5151abstract class Block implements Built <Block , BlockBuilder >, Code , Spec {
5252 factory Block ([void updates (BlockBuilder b)]) = _$Block ;
5353
54+ factory Block .of (Iterable <Code > statements) {
55+ return new Block ((b) => b..statements.addAll (statements));
56+ }
57+
5458 Block ._();
5559
5660 @override
@@ -111,7 +115,33 @@ abstract class CodeEmitter implements CodeVisitor<StringSink> {
111115 }
112116}
113117
114- /// Represents a simple, literal [code] block to be inserted as-is.
118+ /// Represents a code block that requires lazy visiting.
119+ class LazyCode implements Code {
120+ final Spec Function (SpecVisitor ) generate;
121+
122+ const LazyCode ._(this .generate);
123+
124+ @override
125+ R accept <R >(CodeVisitor <R > visitor, [R context]) {
126+ return generate (visitor).accept (visitor, context);
127+ }
128+ }
129+
130+ /// Returns a generic [Code] that is lazily generated when visited.
131+ Code lazyCode (Code Function () generate) => new _LazyCode (generate);
132+
133+ class _LazyCode implements Code {
134+ final Code Function () generate;
135+
136+ const _LazyCode (this .generate);
137+
138+ @override
139+ R accept <R >(CodeVisitor <R > visitor, [R context]) {
140+ return generate ().accept (visitor, context);
141+ }
142+ }
143+
144+ /// Represents a simple, literal code block to be inserted as-is.
115145class StaticCode implements Code {
116146 final String code;
117147
@@ -126,9 +156,9 @@ class StaticCode implements Code {
126156 String toString () => code;
127157}
128158
129- /// Represents a [ code] block that may require scoping.
159+ /// Represents a code block that may require scoping.
130160class ScopedCode implements Code {
131- final String Function (Allocate allocate ) code;
161+ final String Function (Allocate ) code;
132162
133163 const ScopedCode ._(this .code);
134164
0 commit comments