Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 8381adf

Browse files
committed
added: TChan
1 parent 72aab91 commit 8381adf

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

‎Chan.hs‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
module Chan where
22

33
import Control.Concurrent hiding (Chan)
4+
import Control.Concurrent.STM hiding (TChan)
45

56
type Stream a = MVar (Item a)
67
data Item a = Item a (Stream a)
@@ -35,3 +36,50 @@ dupChan (Chan _ writeVar) = do
3536
newReadVar <- newMVar hole
3637
return $ Chan newReadVar writeVar
3738

39+
type TVarList a = TVar (TList a)
40+
data TList a = Nil
41+
| TCons a (TVarList a)
42+
43+
data TChan a = TChan (TVar (TVarList a)) (TVar (TVarList a))
44+
45+
newTChan :: STM (TChan a)
46+
newTChan = do
47+
hole <- newTVar Nil
48+
read <- newTVar hole
49+
write <- newTVar hole
50+
return $ TChan read write
51+
52+
writeTChan :: TChan a -> a -> STM ()
53+
writeTChan (TChan _ write) val = do
54+
newHole <- newTVar Nil
55+
oldHole <- readTVar write
56+
writeTVar oldHole $ TCons val newHole
57+
writeTVar write newHole
58+
59+
readTChan :: TChan a -> STM a
60+
readTChan (TChan read _) = do
61+
stream <- readTVar read
62+
head <- readTVar stream
63+
case head of
64+
Nil -> retry
65+
TCons val next -> do
66+
writeTVar read next
67+
return val
68+
69+
unGetTChan :: TChan a -> a -> STM ()
70+
unGetTChan (TChan read _) val = do
71+
head <- readTVar read
72+
newHead <- newTVar (TCons val head)
73+
writeTVar read newHead
74+
75+
isEmptyTChan :: TChan a -> STM Bool
76+
isEmptyTChan (TChan read _) = do
77+
list <- readTVar read
78+
head <- readTVar list
79+
case head of
80+
Nil -> return True
81+
_ -> return False
82+
83+
84+
85+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /