content: #!/usr/bin/env stack
  -- stack runghc --package reanimate
  {-# LANGUAGE FlexibleContexts #-}
  module Main (main) where
  
  main :: IO ()
  main = return ()
  {-
  import           Diagrams.Prelude              hiding (Animation, boundingBox,
                                                  center, circle, duration,
                                                  fontSize, rotate, scale,
                                                  translate)
  import qualified Diagrams.Prelude              as D
  import           Reanimate.Diagrams
  import           Reanimate hiding ((#))
  
  
  main :: IO ()
  main = reanimate $ repeatA 5 $ mkAnimation 5 $ \t ->
      mkGroup
      [ mkBackground "black"
      , scale (2/50) $ center $ -- translate (-320/2) (-180/2) $
        withStrokeColor "white" $
        renderDiagram $
          withEnvelope (D.rect 320 180 :: SvgDiagram) $
          D.scale 50 $
          lc white $
          example t ]
  
  vectorField :: (Double, Double) -> V2 Double
  vectorField (x, y) = r2 (sin (y + 1), sin (x + 1))
  
  arrowAtPoint :: (Double, Double) -> SvgDiagram
  arrowAtPoint (x, y) = arrowAt' opts (p2 (x, y)) (sL *^ vf) # alignTL
    where
      vf   = vectorField (x, y)
      m    = norm $ vectorField (x, y)
  
  -- Head size is a function of the length of the vector
  -- as are tail size and shaft length.
  
      hs   = 0.02 * m
      sW   = 0.004 * m
      sL   = 0.05 + 0.1 * m
      opts = (with & arrowHead  .~ spike
                   & headLength .~ normalized hs
                   & shaftStyle %~ lwN sW)
  
  example :: Double -> SvgDiagram
  example n = field
    where
      xOffset = cos (2*pi*n)
      yOffset = sin (2*pi*n)
      locs   = [(x+xOffset, y+yOffset) | x <- [0.1, 0.3 .. 3.25], y <- [0.1, 0.3 .. 3.25]]
  
      points = map p2 locs
  
      arrows = map arrowAtPoint locs
      field   = position $ zip points arrows
  -}
  
  