content: {-
      The communication from the QuickPlot server to the browser will be in JSON
      Here is an example of how a message could look like:
  
          {
              "library"   : "plotly",
              "procedure" : "newPlot",
              "content"   : {
                              "data" : [ { "x" : [1,2,3] }, { "x" : [4,5,6] } ]
                            }
          }
  -}
  
  {-# LANGUAGE QuasiQuotes #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  module QuickPlot.IPC.Protocol (
        QPMessage (..)
      , Library (..)
      , Procedure (..)
      , encode
  
  ) where
  
  import           Data.ByteString.Lazy.Internal
  import           Data.Text
  import           QuickPlot.IPC.QQ
  import qualified Data.Aeson as JSON
  
  
  
  -- | Encode a QuickPlot message for transmission to browser
  encode :: QPMessage
         -> ByteString
  encode (QPMessage library procedure content) = JSON.encode message
      where message :: JSON.Value
            message = [json|{
                          library : #{ library },
                          procedure : #{ procedure },
                          content : #{ content }
                      }|]
  
  
  -- | Its possible to specify messages with procedures and libraries that don't exist together
  data QPMessage = QPMessage Library Procedure JSON.Value
  
  data Procedure = NewPlot
                 | Clear
  data Library = QuickPlot
               | Plotly
               | Vis
  
  instance JSON.ToJSON Procedure where
      toJSON NewPlot = JSON.String "newPlot"
      toJSON Clear = JSON.String "clear"
  
  instance JSON.ToJSON Library where
      toJSON QuickPlot = JSON.String "QuickPlot"
      toJSON Plotly = JSON.String "plotly"
      toJSON Vis = JSON.String "vis"
  