packages feed

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

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

module ACME.PreCure.Index where


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

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


writeCureIndexJson :: ()
writeCureIndexJson =
  $( do
        textbookRootMod <-
          fmap (head . 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 []
    )