module Lang.LamIf.Examples where

import Lang.LamIf
import FP
import qualified FP.Pretty as P

examplesMain :: IO ()
examplesMain = flowSensitivityMain

makeOptions :: [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> [String] -> [(Doc, Options)]
makeOptions ltime dtime val monad gc closure lfilter dfilter = do
  lt <- ltime
  dt <- dtime
  v <- val
  m <- monad
  g <- gc
  c <- closure
  lf <- lfilter
  df <- dfilter
  let d = P.hsep $ map P.heading
        [ concat [ "LT=", lt ]
        , concat [ "DT=", dt ]
        , concat [ "V=", v ]
        , concat [ "M=", m ]
        , concat [ "G=", g ]
        , concat [ "C=", c ]
        , concat [ "LF=", lf ]
        , concat [ "DF=", df ]
        ]
      o = Options (timeChoices       #! lt) 
                  (timeChoices       #! dt) 
                  (valChoices        #! v ) 
                  (monadChoices      #! m ) 
                  (gcChoices         #! g ) 
                  (closureChoices    #! c ) 
                  (timeFilterChoices #! lf)
                  (timeFilterChoices #! df)
  return (d, o)


runOptions :: [(Doc, Options)] -> RawExp -> Doc
runOptions os e =
  let (se, c) = stampCPS e
  in P.vsep
    [ P.heading "Source"
    , localSetL P.maxRibbonWidthL 40 $ pretty e 
    , P.heading "Stamped"
    , localSetL P.maxRibbonWidthL 40 $ pretty se
    , P.heading "CPS"
    , localSetL P.maxRibbonWidthL 40 $ pretty c
    , P.vsep $ mapOn os $ \ (info, o) -> withOptions o $ \ gc cc ltf dtf ->
        let ς = execOnlyStuck gc cc ltf dtf c
        in P.vsep
            [ pretty info
            , pretty ς
            ]
    ]

flowSensitivityMain :: IO ()
flowSensitivityMain = do
  e <- parseFile "data/lamif-src/flow-sensitivity.lam"
  let os = makeOptions ["0"] ["0"] ["abstract"] ["fi", "fs", "ps"] ["yes"] ["link"] ["app"] ["app"]
  pprint $ runOptions os e

callSiteSensitivityMain :: IO ()
callSiteSensitivityMain = do
  e <- parseFile "data/lamif-src/call-site-sensitivity.lam"
  let os = makeOptions ["0"] ["0", "1"] ["abstract"] ["fi"] ["yes"] ["link"] ["app"] ["app"]
  pprint $ runOptions os e

objectSensitivityMain :: IO ()
objectSensitivityMain = do
  e <- parseFile "data/lamif-src/object-sensitivity.lam"
  let os = makeOptions ["0", "1"] ["0"] ["abstract"] ["fi"] ["yes"] ["link"] ["app"] ["app"]
  pprint $ runOptions os e