summaryrefslogtreecommitdiff
path: root/Com/Simatime
diff options
context:
space:
mode:
authorBen Sima <ben@bsima.me>2020-04-01 22:51:47 -0700
committerBen Sima <ben@bsima.me>2020-04-01 22:51:47 -0700
commit4ef954f7b3e9b5d99d1030843c2633dbd76f37c0 (patch)
treeb72249c4a5a348a193d9995f1f6228d779150c92 /Com/Simatime
parent1877ee48948e5952a694cfc666ff65a986211c46 (diff)
Bound ques to about 10 items
I also block before taking, instead of doing a mult and tap. This is a simple way to fix the memory issue, and makes them conceptually simpler to work with I think. The channels are still mutli-consumer and multi-producer, which is fine. I'm not sure now I will implement the regular pubsub, but I'm not sure there is a great usecase for that anyway.
Diffstat (limited to 'Com/Simatime')
-rw-r--r--Com/Simatime/Go.hs12
1 files changed, 7 insertions, 5 deletions
diff --git a/Com/Simatime/Go.hs b/Com/Simatime/Go.hs
index e552a90..bd9296a 100644
--- a/Com/Simatime/Go.hs
+++ b/Com/Simatime/Go.hs
@@ -23,12 +23,14 @@ where
import Com.Simatime.Alpha hiding ( read )
import qualified Control.Concurrent as Concurrent
-import qualified Control.Concurrent.Chan.Unagi as Chan
+import qualified Control.Concurrent.Chan.Unagi.Bounded
+ as Chan
-- | A standard channel.
data Channel a = Channel
{ _in :: Chan.InChan a
, _out :: Chan.OutChan a
+ , _size :: Int
}
-- | Starts a background process.
@@ -36,10 +38,10 @@ fork :: IO () -> IO Concurrent.ThreadId
fork = Concurrent.forkIO
-- | Make a new channel.
-chan :: IO (Channel a)
-chan = do
- (i, o) <- Chan.newChan
- return <| Channel i o
+chan :: Int -> IO (Channel a)
+chan n = do
+ (i, o) <- Chan.newChan n
+ return <| Channel i o n
-- | A channel for broadcasting to multiple consumers. See 'mult'.
type Mult a = Chan.OutChan a