{-# Language ViewPatterns #-}
module EVM.Facts.Git
( saveFacts
, loadFacts
, RepoAt (..)
) where
import EVM.Facts (Fact (..), File (..), Path (..), Data (..))
import EVM.Facts (fileToFact, factToFile)
import Control.Lens
import Data.Set (Set)
import Data.Maybe (catMaybes)
import qualified Data.Set as Set
import qualified Restless.Git as Git
newtype RepoAt = RepoAt String
deriving (Eq, Ord, Show)
fileRepr :: Iso' File Git.File
fileRepr = iso f g
where
f :: File -> Git.File
f (File (Path ps p) (Data x)) =
(Git.File (Git.Path ps p) x)
g :: Git.File -> File
g (Git.File (Git.Path ps p) x) =
(File (Path ps p) (Data x))
saveFacts :: RepoAt -> Set Fact -> IO ()
saveFacts (RepoAt repo) facts =
Git.save repo "hevm execution"
(Set.map (view fileRepr . factToFile) facts)
prune :: Ord a => Set (Maybe a) -> Set a
prune = Set.fromList . catMaybes . Set.toList
loadFacts :: RepoAt -> IO (Set Fact)
loadFacts (RepoAt src) =
fmap
(prune . Set.map (fileToFact . view (from fileRepr)))
(Git.load src)