datafix-0.0.0.2: src/Datafix/Worklist/Denotational.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
-- |
-- Module : Datafix.Worklist.Denotational
-- Copyright : (c) Sebastian Graf 2018
-- License : ISC
-- Maintainer : sgraf1337@gmail.com
-- Portability : portable
--
-- Bridges the "Datafix.Worklist" solver for 'DataFlowProblem's ('solveProblem')
-- with the "Datafix.Denotational" approach, using 'MonadDatafix' to describe
-- a 'Denotation'.
module Datafix.Worklist.Denotational
( evalDenotation
) where
import Datafix.Common
import Datafix.Denotational
import Datafix.ProblemBuilder
import Datafix.Worklist.Internal
-- | @evalDenotation denot ib@ returns a value in @domain@ that is described by
-- the denotation @denot@.
--
-- It does so by building up the 'DataFlowProblem' corresponding to @denot@
-- and solving the resulting problem with 'solveProblem', the documentation of
-- which describes in detail how to arrive at a stable denotation and what
-- the 'IterationBound' @ib@ is for.
evalDenotation
:: Datafixable domain
=> Denotation domain
-- ^ A build plan for computing the denotation, possibly involving
-- fixed-point iteration factored through calls to 'datafix'.
-> IterationBound domain
-- ^ Whether the solution algorithm should respect a maximum bound on the
-- number of iterations per point. Pass 'NeverAbort' if you don't care.
-> domain
evalDenotation denot ib = solveProblem prob (Dense max_) ib root
where
(root, max_, prob) = buildProblem denot
{-# INLINE evalDenotation #-}