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 : 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
 After 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
