aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2016-02-04 21:59:52 +0000
committerGregor Kleen <gkleen@yggdrasil.li>2016-02-04 21:59:52 +0000
commitbf1bea05f992dd21f267d25034d2ffd5ef6f865d (patch)
tree393d55e5ebc2bf4e66194030cbc9fd7981c466a5 /server/src
parentf1ceaffc159fe7a591bfc615762867db3f6aa199 (diff)
downloadthermoprint-bf1bea05f992dd21f267d25034d2ffd5ef6f865d.tar
thermoprint-bf1bea05f992dd21f267d25034d2ffd5ef6f865d.tar.gz
thermoprint-bf1bea05f992dd21f267d25034d2ffd5ef6f865d.tar.bz2
thermoprint-bf1bea05f992dd21f267d25034d2ffd5ef6f865d.tar.xz
thermoprint-bf1bea05f992dd21f267d25034d2ffd5ef6f865d.zip
Queue managers
Diffstat (limited to 'server/src')
-rw-r--r--server/src/Thermoprint/Server/Printer.hs3
-rw-r--r--server/src/Thermoprint/Server/Queue.hs33
2 files changed, 35 insertions, 1 deletions
diff --git a/server/src/Thermoprint/Server/Printer.hs b/server/src/Thermoprint/Server/Printer.hs
index 3700f45..d9cea9d 100644
--- a/server/src/Thermoprint/Server/Printer.hs
+++ b/server/src/Thermoprint/Server/Printer.hs
@@ -56,6 +56,9 @@ data Printer = Printer
56 , queue :: TVar Queue 56 , queue :: TVar Queue
57 } 57 }
58 58
59instance HasQueue Printer where
60 extractQueue = queue
61
59printer :: MonadResource m => m PrinterMethod -> m Printer 62printer :: MonadResource m => m PrinterMethod -> m Printer
60printer p = Printer <$> p <*> liftIO (newTVarIO def) 63printer p = Printer <$> p <*> liftIO (newTVarIO def)
61 64
diff --git a/server/src/Thermoprint/Server/Queue.hs b/server/src/Thermoprint/Server/Queue.hs
index 672d540..bae9617 100644
--- a/server/src/Thermoprint/Server/Queue.hs
+++ b/server/src/Thermoprint/Server/Queue.hs
@@ -1,7 +1,12 @@
1{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} 3{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
4{-# LANGUAGE ExistentialQuantification #-}
2 5
3module Thermoprint.Server.Queue 6module Thermoprint.Server.Queue
4 ( Queue(..), QueueEntry(..) 7 ( Queue(..), QueueEntry(..)
8 , HasQueue(..)
9 , QueueManager(..), runQM
5 ) where 10 ) where
6 11
7import Thermoprint.API (PrintingError(..), Printout) 12import Thermoprint.API (PrintingError(..), Printout)
@@ -12,14 +17,22 @@ import Thermoprint.Server.Database
12import Data.Sequence (Seq) 17import Data.Sequence (Seq)
13import qualified Data.Sequence as Seq 18import qualified Data.Sequence as Seq
14 19
15import Data.Time 20import Data.Time
21import Data.Time.Clock
16 22
17import Control.DeepSeq (NFData) 23import Control.DeepSeq (NFData)
18import Data.Typeable (Typeable) 24import Data.Typeable (Typeable)
19import GHC.Generics (Generic) 25import GHC.Generics (Generic)
20 26
27import Control.Concurrent
28import Control.Concurrent.STM
29import Control.Monad.State
30
21import Data.Default.Class 31import Data.Default.Class
22 32
33import Control.Monad.Morph
34import Control.Monad.Trans.Compose
35
23-- | Zipper for 'Seq QueueEntry' with additional support for 'PrintingError' in the section after point 36-- | Zipper for 'Seq QueueEntry' with additional support for 'PrintingError' in the section after point
24data Queue = Queue 37data Queue = Queue
25 { pending :: Seq QueueEntry -- ^ Pending jobs, closest last 38 { pending :: Seq QueueEntry -- ^ Pending jobs, closest last
@@ -28,6 +41,12 @@ data Queue = Queue
28 } 41 }
29 deriving (Typeable, Generic, NFData) 42 deriving (Typeable, Generic, NFData)
30 43
44class HasQueue a where
45 extractQueue :: a -> TVar Queue
46
47instance HasQueue (TVar Queue) where
48 extractQueue = id
49
31instance Default Queue where 50instance Default Queue where
32 def = Queue 51 def = Queue
33 { pending = Seq.empty 52 { pending = Seq.empty
@@ -41,3 +60,15 @@ data QueueEntry = QueueEntry
41 } 60 }
42 deriving (Typeable, Generic, NFData) 61 deriving (Typeable, Generic, NFData)
43 62
63type QueueManager t = ComposeT (StateT Queue) t STM DiffTime
64
65runQM :: ( HasQueue q
66 , MFunctor t
67 , MonadTrans t
68 , MonadIO (t IO)
69 , Monad (t STM)
70 ) => QueueManager t -> q -> t IO ()
71runQM qm (extractQueue -> q) = forever $ liftIO . threadDelay . toMicro =<< qm'
72 where
73 qm' = hoist atomically $ (\(a, s) -> lift (writeTVar q s) >> return a) =<< runStateT (getComposeT qm) =<< lift (readTVar q)
74 toMicro = (`div` 10^6) . fromEnum