packages feed

Plot-ho-matic-0.4.0.0: examples/Example.hs

{-# OPTIONS_GHC -Wall #-}
{-# Language DeriveGeneric #-}

module Main where

import qualified Control.Concurrent as CC
import GHC.Generics ( Generic )
--import qualified System.Remote.Monitoring as EKG

import PlotHo ( Lookup, SignalTree, runPlotter, addChannel, makeSignalTree )

data Xyz = MkXyz { x :: Double
                 , y :: Double
                 , z :: Double
                 } deriving Generic
data Axyz = MkAxyz { lol :: Double
--                   , xyzList :: S.Seq Xyz
                   , xyz :: Xyz
                   } deriving Generic
instance Lookup Xyz
instance Lookup Axyz

axyz0 :: Axyz
axyz0 = MkAxyz
        7
--        (S.fromList [MkXyz 1 2 3])
        (MkXyz 1 2 3)

xyz0 :: Xyz
xyz0 = MkXyz 1 2 3

incrementAxyz :: Axyz -> Axyz
incrementAxyz (MkAxyz a _) = MkAxyz
                             (a+0.2)
--                             (S.take 5 (xyz <| xyzs))
                             xyz'
  where
    xyz' = MkXyz (sin a) (cos a) (sin a * cos a)

incrementXyz :: Xyz -> Xyz
incrementXyz (MkXyz a _ _) = MkXyz (a+0.3) (2 * sin a) (3 * cos a)

-- a random function to write a bunch of data to a chan
channelWriter :: Int -> (a -> a) -> a -> (a -> IO ()) -> IO ()
channelWriter delay increment x' chan = do
  CC.threadDelay delay
  chan (increment x')
  channelWriter delay increment (increment x') chan

ast :: SignalTree Axyz
ast = makeSignalTree axyz0

st :: SignalTree Xyz
st = makeSignalTree xyz0

main :: IO ()
main = do
--  ekgTid <- fmap EKG.serverThreadId $ EKG.forkServer "localhost" 8000

  runPlotter $ do
    addChannel "posPlus" ast (\w _ -> channelWriter 50000 incrementAxyz axyz0 w)
    addChannel "pos" st (\w _ -> channelWriter 60000 incrementXyz xyz0 w)