type gnode[e] = { member edges : iterable[e] } type gedge[n] = { member src : n member dst : n } type graph[n, e] = (n <: gnode[e]) & (e <: gedge[n])