packages feed

ihaskell-inline-r-0.1.1.0: src/IHaskell/Display/InlineR.hs

-- |
-- Copyright: 2015 (C) Tweag I/O Limited

{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-missing-fields #-}
module IHaskell.Display.InlineR
  ( r
  , rprint
  , rgraph
  , Language.R.Instance.runRegion
  ) where

import           Control.Applicative
import           Control.Monad (when)
import qualified Data.ByteString as BS
import qualified Data.ByteString.Base64 as Base64
import qualified Data.ByteString.Char8 as Char
import           Data.Monoid
import           H.Prelude.Interactive as H -- we use provide instances to IO Monad
import           IHaskell.Display
import           IHaskell.Display.Blaze () -- to confirm it's installed
import           Language.Haskell.TH.Quote
import           Language.R.Instance
import           Language.R.QQ
import           System.IO (hClose)
import           System.IO.Temp (withSystemTempFile)
import qualified Text.Blaze.Html5 as BH
import qualified Text.Blaze.Html5.Attributes as BH
import Prelude -- Silence AMP warning

rprint :: QuasiQuoter
rprint = QuasiQuoter { quoteExp = \s -> [| do H.p $(quoteExp r s) |] }

rgraph :: QuasiQuoter
rgraph = QuasiQuoter { quoteExp = \s ->
    [| withSystemTempFile "ihaskell-inline-r-.png" $ \path h -> do
          hClose h
          _ <- [r| png(filename=path_hs, width=480, height=480, bg="white"); |]
          H.p $(quoteExp r s)
          _ <- [r| dev.off() |]
          encoded <- Base64.encode <$> BS.readFile path
          when (BS.null encoded) $
            fail "No graphical output."
          display $
            BH.img BH.!
              BH.src (BH.unsafeByteStringValue
                        (Char.pack "data:image/png;base64," <> encoded))
     |] }