aboutsummaryrefslogtreecommitdiff
path: root/server/src/Thermoprint/Server/Printer.hs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/Thermoprint/Server/Printer.hs')
-rw-r--r--server/src/Thermoprint/Server/Printer.hs39
1 files changed, 33 insertions, 6 deletions
diff --git a/server/src/Thermoprint/Server/Printer.hs b/server/src/Thermoprint/Server/Printer.hs
index f34b2fa..cd12297 100644
--- a/server/src/Thermoprint/Server/Printer.hs
+++ b/server/src/Thermoprint/Server/Printer.hs
@@ -1,14 +1,18 @@
1{-# LANGUAGE RankNTypes #-} 1{-# LANGUAGE RankNTypes #-}
2{-# LANGUAGE ImpredicativeTypes #-}
2{-# LANGUAGE MultiParamTypeClasses #-} 3{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE FlexibleContexts #-} 4{-# LANGUAGE FlexibleContexts #-}
4{-# LANGUAGE RecordWildCards #-} 5{-# LANGUAGE RecordWildCards #-}
5{-# LANGUAGE OverloadedStrings #-} 6{-# LANGUAGE OverloadedStrings #-}
6{-# LANGUAGE TemplateHaskell #-} 7{-# LANGUAGE TemplateHaskell #-}
7{-# LANGUAGE StandaloneDeriving #-} 8{-# LANGUAGE StandaloneDeriving #-}
9{-# LANGUAGE ExistentialQuantification #-}
10{-# LANGUAGE RecordWildCards #-}
8{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-} 11{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
9 12
10module Thermoprint.Server.Printer 13module Thermoprint.Server.Printer
11 ( Printer(..), printer 14 ( Printer(..), printer
15 , IsPrinter(..), PrinterSpec(..)
12 , Queue(..) 16 , Queue(..)
13 , runPrinter 17 , runPrinter
14 ) where 18 ) where
@@ -41,8 +45,23 @@ import Control.Monad (forever)
41 45
42import Control.Concurrent.STM 46import Control.Concurrent.STM
43 47
44data Printer = Printer 48import Data.Default.Class
45 { print :: forall m. (MonadIO m) => Printout -> m (Maybe PrintingError) 49
50import Prelude hiding (print)
51
52class IsPrinter a where
53 toMethod :: forall m. (MonadResource m) => a -> (forall m1. (MonadResource m1) => m (Printout -> m1 (Maybe PrintingError)))
54
55instance (MonadResource m) => IsPrinter (Printer m) where
56 toMethod Printer{..} = return print
57
58instance (MonadResource m) => IsPrinter (PrinterSpec m) where
59 toMethod (PS p) = toMethod p
60
61data PrinterSpec m = forall p. IsPrinter p => PS p
62
63data Printer m = Printer
64 { print :: Printout -> m (Maybe PrintingError)
46 , queue :: TVar Queue 65 , queue :: TVar Queue
47 } 66 }
48 67
@@ -54,17 +73,25 @@ data Queue = Queue
54 } 73 }
55 deriving (Typeable, Generic, NFData) 74 deriving (Typeable, Generic, NFData)
56 75
57printer :: (MonadIO m) => (forall m. (MonadIO m) => Printout -> m (Maybe PrintingError)) -> m Printer 76instance Default Queue where
58printer f = Printer f <$> liftIO (newTVarIO $ Queue Seq.empty Nothing Seq.empty) 77 def = Queue
78 { pending = Seq.empty
79 , current = Nothing
80 , history = Seq.empty
81 }
82
83printer :: (MonadResource m, MonadResource m1, IsPrinter p) => p -> m (Printer m1)
84-- ^ Version of 'Printer' handling the initialisation of the 'TVar'
85printer p = Printer <$> toMethod p <*> liftIO (newTVarIO def)
59 86
60atomically' :: MonadIO m => STM a -> m a 87atomically' :: MonadIO m => STM a -> m a
61atomically' = liftIO . atomically 88atomically' = liftIO . atomically
62 89
63runPrinter :: ( MonadReader ConnectionPool m 90runPrinter :: ( MonadReader ConnectionPool m
64 , MonadIO m
65 , MonadLogger m 91 , MonadLogger m
92 , MonadResource m
66 , MonadBaseControl IO m 93 , MonadBaseControl IO m
67 ) => Printer -> m () 94 ) => Printer m -> m ()
68-- ^ Loop 'forever' pushing entries from the 'Queue' associated to a 'Printer' into its 'print'-method 95-- ^ Loop 'forever' pushing entries from the 'Queue' associated to a 'Printer' into its 'print'-method
69runPrinter Printer{..} = forever $ do 96runPrinter Printer{..} = forever $ do
70 jobId <- atomically' $ do 97 jobId <- atomically' $ do