State >>
 Items : Array | List
 Step : Integer
;

Report >>
 Key, Record : Arg
 Step : Integer
 Continue : 1 | 0
 Ext : < State : Record >
;

Data >>
 Rq : Arg
 Key, Record : Arg
 Value : Arg
 Step : Integer
 Precision : Float | Const
;

Enumerate ->
Arg T : ^&Record
    Items : Array | List, Rq : Arg, Pc : Float | Const
    Value : < &Arg, Arg >, Store : < Arg, Integer >, Match : < ^&Report, Data >

Let Items, ERR_NO_DATA

En : State = < Items : _, Step : 0 > ..
R : Report = < Ext.State : T, Continue : 1 > ..

- Enumerate 'En' R Value ( K H V S : 
                                     - Match >R< <
                                                   Rq : Rq
                                                   Key : K, Record : H
                                                   Value : V, Step : S
                                                   Precision : Pc
                                                 > 
                         ),
  Store R.Record R.Step R.Key

Return

/* * */

Enumerate Enumerate ->     
Arg En : ^&State, R : Report
    Value : < &Arg, Arg >
    Deliver : < Arg, Arg, Integer >

Do while Next R En.Items
 Detach En.Items Key, Record _

 - Value >V< Record,
   Deliver Key Record V En.Step
 ' En.Step ++
;

Return

/* * */

Next Enumerate Enumerate ->
Arg R : Report, Items : Array | List

When !R.Continue then
Return 0

When !Items then
Return 0

Else
Return 1
