on 6a96e21 help sign in
elk/builder/src/Stuff/Verify.hs
96 lines 2.2 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Stuff.Verify
3 ( verify
4 )
5 where
8import Prelude hiding (read)
9import qualified Data.Map as Map
10import Data.Map (Map)
12import Elm.Package (Name, Version)
14import qualified Deps.Verify as Verify
15import Elm.Project.Json (Project(..), PkgInfo(..))
16import qualified Elm.Project.Json as Project
17import qualified Elm.Project.Constraint as Con
18import qualified Elm.Project.Summary as Summary
19import qualified File.IO as IO
20import qualified Reporting.Task as Task
21import qualified Stuff.Paths as Path
25-- VERIFY
28verify :: FilePath -> Project -> Task.Task Summary.Summary
29verify root project =
30 do fresh <-
31 IO.andM
32 [ IO.exists Path.solution
33 , IO.exists Path.summary
34 , checkSolution project
35 ]
37 if fresh
38 then read root project
39 else rebuildCache root project
42rebuildCache :: FilePath -> Project -> Task.Task Summary.Summary
43rebuildCache root project =
44 do IO.remove Path.solution
45 IO.remove Path.summary
47 (solution, summary) <- Verify.verify root project
49 IO.writeBinary Path.solution solution
50 write summary
51 return summary
55-- READ / WRITE
58read :: FilePath -> Project -> Task.Task Summary.Summary
59read root project =
60 do (exposed, ifaces, graph) <- IO.readBinary Path.summary
61 return (Summary.Summary root project exposed ifaces graph)
64write :: Summary.Summary -> Task.Task ()
65write (Summary.Summary _ _ exposed ifaces graph) =
66 IO.writeBinary Path.summary ( exposed, ifaces, graph )
70-- CHECK SOLUTION
73checkSolution :: Project -> Task.Task Bool
74checkSolution project =
75 checkSolutionHelp project <$> IO.readBinary Path.solution
78checkSolutionHelp :: Project -> Map Name Version -> Bool
79checkSolutionHelp project solution =
80 case project of
81 App info ->
82 solution == Project.appSolution info
84 Pkg info ->
85 allGood (_pkg_test_deps info) solution
86 && allGood (_pkg_deps info) solution
89allGood :: Map Name Con.Constraint -> Map Name Version -> Bool
90allGood cons vsns =
91 let
92 bools =
93 Map.intersectionWith Con.satisfies cons vsns
94 in
95 Map.size cons == Map.size bools
96 && Map.foldr (&&) True bools