Skip to content

Commit

Permalink
Polymorphic entrypoints (#2544)
Browse files Browse the repository at this point in the history
* Added Dhall.checkWithSettings

* Allow running some of the individual stages in pure code
  • Loading branch information
mmhat authored Oct 25, 2023
1 parent df8ff09 commit 251cfe7
Showing 1 changed file with 35 additions and 20 deletions.
55 changes: 35 additions & 20 deletions dhall/src/Dhall.hs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ module Dhall
, parseWithSettings
, resolveWithSettings
, typecheckWithSettings
, checkWithSettings
, expectWithSettings
, normalizeWithSettings

Expand All @@ -59,6 +60,7 @@ module Dhall
) where

import Control.Applicative (Alternative, empty)
import Control.Monad.Catch (MonadThrow, throwM)
import Data.Either.Validation (Validation (..))
import Data.Void (Void)
import Dhall.Import (Imported (..))
Expand Down Expand Up @@ -207,39 +209,52 @@ instance HasEvaluateSettings EvaluateSettings where
evaluateSettings = id

-- | Parse an expression, using the supplied `InputSettings`
parseWithSettings :: InputSettings -> Text -> IO (Expr Src Import)
parseWithSettings settings text = do
Core.throws (Dhall.Parser.exprFromText (view sourceName settings) text)
parseWithSettings :: MonadThrow m => InputSettings -> Text -> m (Expr Src Import)
parseWithSettings settings text =
either throwM return (Dhall.Parser.exprFromText (view sourceName settings) text)

-- | Type-check an expression, using the supplied `InputSettings`
typecheckWithSettings :: InputSettings -> Expr Src Void -> IO ()
typecheckWithSettings settings expression = do
_ <- Core.throws (Dhall.TypeCheck.typeWith (view startingContext settings) expression)
typecheckWithSettings :: MonadThrow m => InputSettings -> Expr Src Void -> m ()
typecheckWithSettings settings expression =
either throwM (return . const ()) (Dhall.TypeCheck.typeWith (view startingContext settings) expression)

return ()

{-| Type-check an expression against a `Decoder`'s expected type, using the
supplied `InputSettings`
{-| Type-check an expression against a type provided as a Dhall expreession,
using the supplied `InputSettings`
-}
expectWithSettings :: InputSettings -> Decoder a -> Expr Src Void -> IO ()
expectWithSettings settings Decoder{..} expression = do
expected' <- case expected of
Success x -> return x
Failure e -> Control.Exception.throwIO e

let suffix = Dhall.Pretty.Internal.prettyToStrictText expected'
checkWithSettings ::
MonadThrow m =>
-- | The input settings
InputSettings ->
-- | The expected type of the expression
Expr Src Void ->
-- | The expression to check
Expr Src Void ->
m ()
checkWithSettings settings type_ expression = do
let suffix = Dhall.Pretty.Internal.prettyToStrictText type_

let annotated = case expression of
Note (Src begin end bytes) _ ->
Note (Src begin end bytes') (Annot expression expected')
Note (Src begin end bytes') (Annot expression type_)
where
bytes' = bytes <> " : " <> suffix
_ ->
Annot expression expected'
Annot expression type_

typecheckWithSettings settings annotated

return ()
{-| Type-check an expression against a `Decoder`'s expected type, using the
supplied `InputSettings`.
This is equivalent of using the 'expected' type of a @Decoder@ as the second
argument to 'checkWithSettings'.
-}
expectWithSettings :: MonadThrow m => InputSettings -> Decoder a -> Expr Src Void -> m ()
expectWithSettings settings Decoder{..} expression = do
expected' <- case expected of
Success x -> return x
Failure e -> throwM e

checkWithSettings settings expected' expression

{-| Resolve an expression, using the supplied `InputSettings`
Expand Down

0 comments on commit 251cfe7

Please sign in to comment.