-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSetup.hs
More file actions
53 lines (45 loc) · 1.69 KB
/
Copy pathSetup.hs
File metadata and controls
53 lines (45 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
import Control.Monad (when)
import qualified Data.ByteString.Char8 as B
import Data.List (intercalate, sort)
import Data.String.Interpolate
import Data.String.Interpolate.Util
import Data.Text (pack)
import qualified Data.Text.IO as T
import Distribution.PackageDescription (emptyHookedBuildInfo)
import Distribution.Simple
import Distribution.Simple.Command (noExtraFlags)
import FlatParse.Basic
import System.FilePath.Glob
import Text.Printf
buildImportFile = do
files <- sort . map B.pack <$> glob "src/Year????/Day??.hs"
let importedModules = foldr fn [] files
output = pack $ unindent [i|
{-# LANGUAGE TemplateHaskell #-}
module Days
( problem
, problems
) where
import DaysTH
#{intercalate "\n " importedModules}
$(buildProbs)
|]
contents <- T.readFile "src/Days.hs"
when (contents /= output) $
T.writeFile "src/Days.hs" output
where fn f imp = ("import " ++ module') : imp
where module' = let (year, day) = parse f
in "Year" ++ year ++ ".Day" ++ day
parser = (,) <$> ($(string "src/Year") *> some (satisfy isDigit))
<*> ($(string "/Day") *> some (satisfy isDigit) <* $(string ".hs"))
parse inp = case runParser parser inp of
OK res _ -> res
_ -> error "unreachable"
myUserHooks = simpleUserHooks {
preBuild = fn
}
where fn args _ = do
buildImportFile
return emptyHookedBuildInfo
main = defaultMainWithHooks myUserHooks