packages feed

typesafe-precure-0.12.0.1: src/ACME/PreCure/Index.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}

module ACME.PreCure.Index where


import           Control.Monad              (forM)
import           Data.Aeson                 (encode)
import           Data.Aeson.Encode.Pretty   (encodePretty)
import qualified Data.ByteString.Lazy       as ByteString
import           Data.Data                  (Data)
import           Language.Haskell.TH        (Q, runIO, thisModule, tupE)
import           Language.Haskell.TH.Syntax (Module)
import           Safe                       (headNote)

import           ACME.PreCure.Index.Lib
import           ACME.PreCure.Index.Types
import           ACME.PreCure.Textbook      ()


writeCureIndexJson :: ()
writeCureIndexJson =
  $( do
        let e = "Assertion failure: empty textbook root module."
        textbookRootMod <-
          fmap (headNote e . filter isTextbookMod) . loadImportedModules =<< thisModule :: Q Module
        -- ^ ACME.PreCure.Textbook

        modsImportedByRoot <- loadImportedModules textbookRootMod :: Q [Module]

        let collectAnnotationsFromEachSeriesModules :: Data a => Q [a]
            collectAnnotationsFromEachSeriesModules =
              fmap concat . forM modsImportedByRoot $ \eachSeriesMod {- ACME.PreCure.Textbook.* -} ->
                concat <$> loadAnnotations eachSeriesMod

        index <-
          mkIndex
            <$> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
            <*> collectAnnotationsFromEachSeriesModules
        runIO $ ByteString.writeFile "gen/cure-index.json" $ encode index
        runIO $ ByteString.writeFile "gen/pretty-cure-index.json" $ encodePretty index
        tupE []
    )