{-# LANGUAGE RankNTypes, TypeApplications #-}
module Build.Task.MonadPlus (random, computeND, correctBuildValue) where
import Control.Monad
import Build.Task
import Build.Task.Wrapped
import Build.Store
random :: (Int, Int) -> Task MonadPlus k Int
random (low, high) = const $ foldr mplus mzero $ map pure [low..high]
computeND :: Task MonadPlus k v -> (k -> v) -> [v]
computeND task store = task (return . store)
correctBuildValue :: Eq v => Tasks MonadPlus k v -> Store i k v -> Store i k v -> k -> Bool
correctBuildValue tasks store result k = case tasks k of
Nothing -> getValue k result == getValue k store
Just t -> getValue k result `elem` computeND (unwrap @MonadPlus t) (flip getValue store)