aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/Thermoprint/Server/Printer.hs3
-rw-r--r--server/src/Thermoprint/Server/Queue.hs33
-rw-r--r--server/thermoprint-server.cabal1
-rw-r--r--server/thermoprint-server.nix10
4 files changed, 41 insertions, 6 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
diff --git a/server/thermoprint-server.cabal b/server/thermoprint-server.cabal
index b948ce3..2eda3b5 100644
--- a/server/thermoprint-server.cabal
+++ b/server/thermoprint-server.cabal
@@ -47,6 +47,7 @@ library
47 , transformers >=0.3.0 && <1 47 , transformers >=0.3.0 && <1
48 , wai >=3.0.4 && <4 48 , wai >=3.0.4 && <4
49 , warp >=3.1.9 && <4 49 , warp >=3.1.9 && <4
50 , mmorph >=1.0.5 && <2
50 hs-source-dirs: src 51 hs-source-dirs: src
51 default-language: Haskell2010 52 default-language: Haskell2010
52 53
diff --git a/server/thermoprint-server.nix b/server/thermoprint-server.nix
index afcf2ba..1cbccd2 100644
--- a/server/thermoprint-server.nix
+++ b/server/thermoprint-server.nix
@@ -1,8 +1,8 @@
1{ mkDerivation, base, conduit, containers, data-default-class 1{ mkDerivation, base, conduit, containers, data-default-class
2, deepseq, dyre, either, exceptions, monad-control, monad-logger 2, deepseq, dyre, either, exceptions, mmorph, monad-control
3, mtl, persistent, persistent-sqlite, persistent-template 3, monad-logger, mtl, persistent, persistent-sqlite
4, resourcet, servant-server, stdenv, stm, text, thermoprint-spec 4, persistent-template, resourcet, servant-server, stdenv, stm, text
5, time, transformers, wai, warp 5, thermoprint-spec, time, transformers, wai, warp
6}: 6}:
7mkDerivation { 7mkDerivation {
8 pname = "thermoprint-server"; 8 pname = "thermoprint-server";
@@ -12,7 +12,7 @@ mkDerivation {
12 isExecutable = true; 12 isExecutable = true;
13 libraryHaskellDepends = [ 13 libraryHaskellDepends = [
14 base conduit containers data-default-class deepseq dyre either 14 base conduit containers data-default-class deepseq dyre either
15 exceptions monad-control monad-logger mtl persistent 15 exceptions mmorph monad-control monad-logger mtl persistent
16 persistent-template resourcet servant-server stm text 16 persistent-template resourcet servant-server stm text
17 thermoprint-spec time transformers wai warp 17 thermoprint-spec time transformers wai warp
18 ]; 18 ];