module Data.OpenApi.Compare.Validate.Sums
  ( checkSums,
  )
where

import Data.Foldable
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import Data.OpenApi.Compare.Behavior
import Data.OpenApi.Compare.Paths
import Data.OpenApi.Compare.Subtree

checkSums ::
  (Ord k, Issuable l) =>
  Paths q r l ->
  (k -> Issue l) ->
  (k -> ProdCons t -> CompatFormula' q AnIssue r ()) ->
  ProdCons (Map k t) ->
  CompatFormula' q AnIssue r ()
checkSums :: Paths q r l
-> (k -> Issue l)
-> (k -> ProdCons t -> CompatFormula' q AnIssue r ())
-> ProdCons (Map k t)
-> CompatFormula' q AnIssue r ()
checkSums Paths q r l
xs k -> Issue l
noElt k -> ProdCons t -> CompatFormula' q AnIssue r ()
check (ProdCons Map k t
p Map k t
c) = [(k, t)]
-> ((k, t) -> CompatFormula' q AnIssue r ())
-> CompatFormula' q AnIssue r ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Map k t -> [(k, t)]
forall k a. Map k a -> [(k, a)]
M.toList Map k t
p) (((k, t) -> CompatFormula' q AnIssue r ())
 -> CompatFormula' q AnIssue r ())
-> ((k, t) -> CompatFormula' q AnIssue r ())
-> CompatFormula' q AnIssue r ()
forall a b. (a -> b) -> a -> b
$ \(k
key, t
prodElt) ->
  case k -> Map k t -> Maybe t
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
key Map k t
c of
    Maybe t
Nothing -> Paths q r l -> Issue l -> CompatFormula' q AnIssue r ()
forall (l :: BehaviorLevel)
       (q :: BehaviorLevel -> BehaviorLevel -> *) (r :: BehaviorLevel) a.
Issuable l =>
Paths q r l -> Issue l -> CompatFormula' q AnIssue r a
issueAt Paths q r l
xs (Issue l -> CompatFormula' q AnIssue r ())
-> Issue l -> CompatFormula' q AnIssue r ()
forall a b. (a -> b) -> a -> b
$ k -> Issue l
noElt k
key
    Just t
consElt ->
      let sumElts :: ProdCons t
sumElts = t -> t -> ProdCons t
forall a. a -> a -> ProdCons a
ProdCons t
prodElt t
consElt
       in k -> ProdCons t -> CompatFormula' q AnIssue r ()
check k
key ProdCons t
sumElts