content: #!/usr/bin/env stack
  -- stack runghc --package reanimate
  {-# LANGUAGE OverloadedStrings #-}
  module Main(main) where
  
  import           Control.Lens
  import           Control.Monad
  import           Data.Text                       (Text)
  import           Reanimate
  import           Reanimate.Builtin.Documentation
  import           Reanimate.LaTeX
  import           Reanimate.Scene
  
  main :: IO ()
  main = reanimate $ docEnv $ mapA (withFillOpacity 1) $ scene $ do
    line1 <- newLaTeX ["$>$ ", "knock!", " ", "knock!"]
    oModifyMany line1 $
      oTopY .~ screenTop
  
    oShowWith (line1!!0) oFadeIn
    oShow (line1!!1); wait 0.3
    oShow (line1!!3); wait 0.6
  
    line2 <- newLaTeX ["$>$ ", "who's there?"]
    mapM_ (`placeBelow` head line1) line2
  
    oShowWith (line2!!0) oFadeIn 
    oShowWith (line2!!1) oDraw
  
    line3 <- newLaTeX ["$>$ ", "$(\\lambda x . x)$"]
    mapM_ (`placeBelow` head line2) line3
  
    oShowWith (line3!!0) oFadeIn
    oShowWith (line3!!1) oFadeIn
  
    line4 <- newLaTeX ["$>$ ", "$(\\lambda x . x)$", " ", "who?"]
    mapM_ (`placeBelow` head line3) line4
  
    oShowWith (line4!!0) oFadeIn
    oShowWith (line4!!1) oFadeIn
    oShowWith (line4!!3) oDraw
  
    line5 <- newLaTeX ["$>$ ", "who?"]
    mapM_ (`placeBelow` head line4) line5
  
    oShowWith (line5!!0) oFadeIn
    oShowWith (line5!!1) oDraw
  
    wait 1
  
  oModifyMany :: [Object s a] -> (ObjectData a -> ObjectData a) -> Scene s ()
  oModifyMany os m = forM_ os $ \o -> oModify o m
  
  placeBelow :: Object s a -> Object s b -> Scene s ()
  placeBelow a b = do
    bBot <- oRead b oBottomY
    oModify a $
      oTopY .~ bBot
  
  newLaTeX :: [Text] -> Scene s [Object s SVG]
  newLaTeX chunks = mapM (newObject . translate (-4) 0) $ latexChunks chunks
  