Browse Source

DataImportServer: configurable parsers

master
Denis Tereshkin 9 years ago
parent
commit
30d6ea6649
  1. 4
      app/Main.hs
  2. 4
      quik-connector.cabal
  3. 10
      src/QuoteSource/DataImport.hs
  4. 6
      src/QuoteSource/TableParser.hs

4
app/Main.hs

@ -10,6 +10,8 @@ import Data.IORef
import Graphics.UI.Gtk hiding (Action, backspace) import Graphics.UI.Gtk hiding (Action, backspace)
import Control.Concurrent.BoundedChan import Control.Concurrent.BoundedChan
import Data.ATrade import Data.ATrade
import QuoteSource.TableParsers.AllParamsTableParser
import QuoteSource.TableParser
callback :: DdeCallback callback :: DdeCallback
callback = undefined callback = undefined
@ -20,7 +22,7 @@ main = do
forkIO $ forever $ do forkIO $ forever $ do
tick <- readChan chan tick <- readChan chan
when (datatype tick == Price) $ print tick when (datatype tick == Price) $ print tick
dis <- initDataImportServer chan "atrade" dis <- initDataImportServer [MkTableParser $ mkAllParamsTableParser "allparams"] chan "atrade"
void initGUI void initGUI
window <- windowNew window <- windowNew
window `on` deleteEvent $ do window `on` deleteEvent $ do

4
quik-connector.cabal

@ -19,6 +19,8 @@ library
, QuoteSource.DDE , QuoteSource.DDE
, QuoteSource.DataImport , QuoteSource.DataImport
, Data.ATrade , Data.ATrade
, QuoteSource.TableParser
, QuoteSource.TableParsers.AllParamsTableParser
ghc-options: -Wincomplete-patterns ghc-options: -Wincomplete-patterns
build-depends: base >= 4.7 && < 5 build-depends: base >= 4.7 && < 5
, Win32 , Win32
@ -37,8 +39,6 @@ library
default-language: Haskell2010 default-language: Haskell2010
extra-libraries: "user32" extra-libraries: "user32"
other-modules: QuoteSource.XlParser other-modules: QuoteSource.XlParser
, QuoteSource.TableParser
, QuoteSource.TableParsers.AllParamsTableParser
executable quik-connector-exe executable quik-connector-exe
hs-source-dirs: app hs-source-dirs: app

10
src/QuoteSource/DataImport.hs

@ -1,4 +1,3 @@
{-# LANGUAGE ExistentialQuantification #-}
module QuoteSource.DataImport module QuoteSource.DataImport
( (
@ -14,13 +13,10 @@ import Data.IORef
import Data.Time.Clock import Data.Time.Clock
import QuoteSource.DDE import QuoteSource.DDE
import QuoteSource.TableParser import QuoteSource.TableParser
import QuoteSource.TableParsers.AllParamsTableParser
import QuoteSource.XlParser import QuoteSource.XlParser
import qualified Data.Map as M import qualified Data.Map as M
data TableParserInstance = forall a . TableParser a => MkTableParser a
data ServerState = ServerState { data ServerState = ServerState {
appName :: String, appName :: String,
parsers :: IORef (M.Map String TableParserInstance), parsers :: IORef (M.Map String TableParserInstance),
@ -41,9 +37,9 @@ ddeCallback state topic table = do
_ -> return False _ -> return False
initDataImportServer :: BoundedChan Tick -> String -> IO (ServerState, IORef DdeState) initDataImportServer :: [TableParserInstance] -> BoundedChan Tick -> String -> IO (ServerState, IORef DdeState)
initDataImportServer tickChan applicationName = do initDataImportServer parsers tickChan applicationName = do
parsers <- newIORef $ M.fromList $ map (\p -> (getTableId p, MkTableParser p)) [mkAllParamsTableParser "allparams"] parsers <- newIORef $ M.fromList $ map (\(MkTableParser p) -> (getTableId p, MkTableParser p)) parsers
let s = ServerState { appName = applicationName, parsers = parsers, tickChannel = tickChan } let s = ServerState { appName = applicationName, parsers = parsers, tickChannel = tickChan }
d <- initializeDde applicationName "default" (ddeCallback s) d <- initializeDde applicationName "default" (ddeCallback s)
return (s, d) return (s, d)

6
src/QuoteSource/TableParser.hs

@ -1,6 +1,8 @@
{-# LANGUAGE ExistentialQuantification #-}
module QuoteSource.TableParser ( module QuoteSource.TableParser (
TableParser(..) TableParser(..),
TableParserInstance(..)
) where ) where
import QuoteSource.XlParser import QuoteSource.XlParser
@ -8,6 +10,8 @@ import Data.ATrade
import Control.Monad.State.Strict import Control.Monad.State.Strict
import Data.Time.Clock import Data.Time.Clock
data TableParserInstance = forall a . TableParser a => MkTableParser a
class TableParser a where class TableParser a where
parseXlTable :: (Int, Int, [XlData]) -> State a [Tick] parseXlTable :: (Int, Int, [XlData]) -> State a [Tick]
giveTimestampHint :: a -> UTCTime -> a giveTimestampHint :: a -> UTCTime -> a

Loading…
Cancel
Save