1
+ library web.layer;
2
+ import "dart:async" show Future;
3
+
4
+ abstract class Layer {
5
+ /// This class is base of all of Layers
6
+ /// [Layer.apply] must be async
7
+ void apply (List args, [Map <Symbol , dynamic > namedArgs]);
8
+
9
+ factory Layer (Function f){
10
+ /// Return a [FunctionalLayer]
11
+ return new FunctionalLayer (f);
12
+ }
13
+ }
14
+
15
+
16
+ class FunctionalLayer implements Layer {
17
+ Function function;
18
+
19
+ FunctionalLayer (this .function);
20
+
21
+ Future run (List args, [Map <Symbol , dynamic > namedArgs]) async {
22
+ if (args == null ) {
23
+ args = [];
24
+ }
25
+ if (namedArgs != null ) {
26
+ await Function .apply (function, args, namedArgs);
27
+ } else {
28
+ await Function .apply (function, args);
29
+ }
30
+ }
31
+
32
+ Future apply (List args, [Map <Symbol , dynamic > namedArgs]) async {
33
+ await this .run (args,namedArgs);
34
+ }
35
+
36
+ }
37
+
38
+
39
+ class LayerManager {
40
+ LayerChain chain;
41
+
42
+ LayerManager (){
43
+ chain = new LayerChain .empty ();
44
+ }
45
+
46
+ LayerState createState () => chain.newState;
47
+ LayerState get newState => createState ();
48
+ }
49
+
50
+
51
+ class LayerChain {
52
+ List <Layer > list;
53
+ Map <String , dynamic > global;
54
+
55
+ LayerChain (this .list,[Map <String , dynamic > map]){
56
+ if (map == null ) {
57
+ global = < String , dynamic > {};
58
+ }
59
+ }
60
+
61
+ factory LayerChain .empty (){
62
+ return new LayerChain (< Layer > []);
63
+ }
64
+
65
+ void add (Layer layer) => list.add (layer);
66
+
67
+ void addAll (Iterable <Layer > iterable) => list.addAll (iterable);
68
+
69
+ void insert (int index, Layer layer) => list.insert (index, layer);
70
+
71
+ void insertAll (int startIndex, Iterable <Layer > iter) => list.insertAll (
72
+ startIndex, iter
73
+ );
74
+
75
+ LayerState createState () => new LayerState (this );
76
+ LayerState get newState => createState ();
77
+
78
+ }
79
+
80
+
81
+ typedef void LayerForEachHandler (Layer layer);
82
+
83
+
84
+ class LayerState {
85
+ LayerChain pchain;
86
+ int _rawPointer;
87
+ Map <String , dynamic > memories;
88
+
89
+ LayerState (this .pchain){
90
+ this .memories.addAll (this .pchain.global);
91
+ }
92
+
93
+ Future start (List args, [Map <Symbol , dynamic > namedArgs]) async {
94
+ forEach ((Layer layer) async {
95
+ await layer.apply (args,namedArgs);
96
+ });
97
+ }
98
+
99
+ Layer next (){
100
+ _rawPointer ++ ;
101
+ if ((rawPointer + 1 ) > pchain.list.length){
102
+ return null ;
103
+ }
104
+ return pointer;
105
+ }
106
+
107
+ Future forEach (LayerForEachHandler h) async {
108
+ while (true ) {
109
+ var layer = next ();
110
+ if (layer){
111
+ await h (layer);
112
+ } else {
113
+ break ;
114
+ }
115
+ }
116
+ }
117
+
118
+ Layer get pointer => pchain.list[rawPointer];
119
+
120
+ int get rawPointer => _rawPointer;
121
+ }
0 commit comments