content: {-# LANGUAGE OverloadedStrings #-}
  
  --
  -- Based on the Elm VegaLite ProjctionTests.elm as of version 1.12.0
  --
  module ProjectionTests (testSpecs) where
  
  import qualified Data.Text as T
  
  import Graphics.Vega.VegaLite
  
  import Prelude hiding (filter)
  
  
  testSpecs :: [(String, VegaLite)]
  testSpecs = standardProjs
              ++ [ configExample
                 , reflectExample False False
                 , reflectExample True False
                 , reflectExample False True
                 , reflectExample True True
                 ]
              ++ d3Projections
  
  
  {- Some relevant data sources:
  
     https://github.com/deldersveld/topojson
     https://github.com/topojson/world-atlas
  
     graticule.json produced with mapshaper.org:
       open console and type -graticule then export as topojson.
  -}
  
  
  worldMapTemplate :: String -> [ProjectionProperty] -> (String, VegaLite)
  worldMapTemplate tText projProps =
      ( tText
      , toVegaLite
          [ width 500
          , height 300
          , title (T.pack tText) []
          , background "#c1e7f5"
          , projection projProps
  
          --, dataFromUrl "https://vega.github.io/vega-lite/data/world-110m.json" [ TopojsonFeature "countries" ]
          , dataFromUrl "https://vega.github.io/vega-lite/data/graticule.json" [ TopojsonFeature "graticule" ]
          , mark Geoshape [ MFillOpacity 0.01, MStroke "#411", MStrokeWidth 0.5 ]
          ]
      )
  
  standardProjs :: [(String, VegaLite)]
  standardProjs =
      [ worldMapTemplate "Albers" [ PrType Albers ]
      , worldMapTemplate "AzimuthalEqualArea" [ PrType AzimuthalEqualArea ]
      , worldMapTemplate "AzimuthalEquidistant" [ PrType AzimuthalEquidistant ]
      , worldMapTemplate "ConicConformal" [ PrType ConicConformal, PrClipAngle (Just 65) ]
      , worldMapTemplate "ConicEqualArea" [ PrType ConicEqualArea ]
      , worldMapTemplate "ConicEquidistant" [ PrType ConicEquidistant ]
      , worldMapTemplate "EqualEarth" [ PrType EqualEarth ]
      , worldMapTemplate "Equirectangular" [ PrType Equirectangular ]
      , worldMapTemplate "Gnomonic" [ PrType Gnomonic ]
      , worldMapTemplate "Identity" [ PrType Identity ]
      , worldMapTemplate "Mercator" [ PrType Mercator ]
      , worldMapTemplate "NaturalEarth1" [ PrType NaturalEarth1 ]
      , worldMapTemplate "Orthographic" [ PrType Orthographic ]
      , worldMapTemplate "Stereographic" [ PrType Stereographic ]
      , worldMapTemplate "TransverseMercator" [ PrType TransverseMercator ]
      ]
  
  
  d3Projections :: [(String, VegaLite)]
  d3Projections =
      -- Note these require registering via JavaScript in the hosting page.
      let
          customSpec pText =
              worldMapTemplate pText [ PrType (Custom (T.pack pText))
                                     , PrClipAngle (Just 179.999)
                                     , PrRotate 20 (-90) 0
                                     , PrPrecision 0.1 ]
      in
      map customSpec [ "airy", "aitoff", "armadillo", "august", "baker", "berghaus", "bertin1953", "boggs", "bonne", "bottomley", "collignon", "craig", "craster", "cylindricalequalarea", "cylindricalstereographic", "eckert1", "eckert2", "eckert3", "eckert4", "eckert5", "eckert6", "eisenlohr", "fahey", "foucaut", "gingery", "winkel3" ]
  
  
  configExample :: (String, VegaLite)
  configExample =
      let
          cfg =
              configure
                  . configuration (BackgroundStyle "rgb(251,247,238)")
                  . configuration (TitleStyle [ TFont "Roboto", TFontWeight W600, TFontSize 18 ])
                  . configuration (ViewStyle [ ViewContinuousWidth 500
                                             , ViewContinuousHeight 300
                                             , ViewNoStroke ])
                  . configuration (AutosizeStyle [ AFit ])
                  . configuration (ProjectionStyle [ PrType Orthographic, PrRotate 0 0 0 ])
  
          globeSpec =
              asSpec
                  [ dataFromUrl "data/globe.json" [ TopojsonFeature "globe" ]
                  , mark Geoshape [ MColor "#c1e7f5" ]
                  ]
  
          graticuleSpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/graticule.json" [ TopojsonFeature "graticule" ]
                  , mark Geoshape [ MFillOpacity 0.01, MStroke "#411", MStrokeWidth 0.1 ]
                  ]
  
          countrySpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/world-110m.json" [ TopojsonFeature "countries" ]
                  , mark Geoshape [ MColor "#708E71" ]
                  ]
      in
      ( "configExample"
      , toVegaLite [ title "Hello, World!" [], cfg [], layer [ globeSpec, graticuleSpec, countrySpec ] ]
      )
  
  
  reflectExample :: Bool -> Bool -> (String, VegaLite)
  reflectExample rx ry =
      let
          tname =
              if not rx && not ry then
                  "identityExample"
  
              else
                  "reflect"
                      ++ (if rx then
                              "X"
  
                          else
                              ""
                         )
                      ++ (if ry then
                              "Y"
  
                          else
                              ""
                         )
                      ++ "Example"
  
          globeSpec =
              asSpec
                  [ dataFromUrl "data/globe.json" [ TopojsonFeature "globe" ]
                  , mark Geoshape [ MColor "#c1e7f5" ]
                  , projection [ PrType Identity, PrReflectX rx, PrReflectY ry ]
                  ]
  
          graticuleSpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/graticule.json" [ TopojsonFeature "graticule" ]
                  , mark Geoshape [ MFillOpacity 0.01, MStroke "#411", MStrokeWidth 0.1 ]
                  , projection [ PrType Identity, PrReflectX rx, PrReflectY ry ]
                  ]
  
          countrySpec =
              asSpec
                  [ dataFromUrl "https://vega.github.io/vega-lite/data/world-110m.json" [ TopojsonFeature "countries" ]
                  , mark Geoshape [ MColor "#708E71" ]
                  , projection [ PrType Identity, PrReflectX rx, PrReflectY ry ]
                  ]
      in
      ( tname, toVegaLite [ width 500, height 250, layer [ globeSpec, graticuleSpec, countrySpec ] ] )
  