Concurrent Clean : カウンタ

JavaScriptクロージャを使ったカウンタを真似して、

function makeCounter () {
  var count = 0;
  return f;
  
  function f () {
    return count++;
  }
}

Concurrent Cleanでも作ってみたけれど、よくみたら、ただの遅延ストリームだった。

::Counter a = Counter a (Counter a)

makecounter
	= f count
where
	count = [0..]
	f :: [a] -> Counter a
	f [c:r] = Counter c (f r)

Start
	# counter = makecounter
	# (Counter c0 counter) = counter
	# (Counter c1 counter) = counter
	# (Counter c2 counter) = counter
	# (Counter c3 counter) = counter
	= [c0, c1, c2, c3]