fcn vogel(costs,supply,demand){ // a Dictionary can be created via a list of (k,v) pairs res:= Dictionary(costs.pump(List,fcn([(k,_)]){ return(k,D()) })); g := Dictionary(); // cross index costs and make writable supply.pump(Void,'wrap([(k,_)]){ g[k] = costs[k].keys.sort('wrap(a,b){ costs[k][a]s[t]) T(f,g[f][0]) else T(g[t][0],t)); v:=supply[f].min(demand[t]); res[f].appendV(t,v); // create t:(v) or append v to t:(...) if(0 == (demand[t]-=v)){ supply.pump(Void,'wrap([(k,n)]){ if(n!=0) g[k].remove(t) }); g.del(t); demand.del(t); } if(0 == (supply[f]-=v)){ demand.pump(Void,'wrap([(k,n)]){ if(n!=0) g[k].remove(f) }); g.del(f); supply.del(f); } }//while res }