getSkipChan

http://d.hatena.ne.jp/syd_syd/20041224#1103830417より。

getSkipChan :: SkipChan a -> IO a
getSkipChan (main,sem) 
  = do  takeMVar sem      -- <<------------------
        (v,sems) <- takeMVar main
        putMVar main (v, sem:sems)
        return v

だと思います。

  • takeMVar semsemが空になるので、その後putSkipChanでmainを通じてsemに補給されないかぎり同じSkipChanから(再び)getSkipChanすることはできない。
  • 同じvを書き戻しているので、そのvを書き込んだputChan(も含め)以前に補給されたSkipChan(そのputより前に最後にgetしたSkipChan)は同じvを読むことが(次のputChanまでに間に合えば)可能。