{-# language ApplicativeDo #-} {-# language GADTs #-} {-# language GeneralizedNewtypeDeriving #-} {-# language LambdaCase #-} {-# language RecordWildCards #-} module Dhall.Extra ( makeUnion , validateType , sortExpr ) where import Control.Monad ( join ) import Data.List ( sortBy ) import Data.Ord ( comparing ) import qualified Data.Text as StrictText import qualified Dhall import qualified Dhall.Core as Dhall ( Expr ) import qualified Dhall.Core as Expr ( Expr(..) ) import qualified Dhall.Map as Map makeUnion :: Map.Map StrictText.Text ( Dhall.Type a ) -> Dhall.Type a makeUnion alts = let extract expr = do Expr.UnionLit ctor v _ <- return expr t <- Map.lookup ctor alts Dhall.extract t v expected = sortExpr ( Expr.Union ( Dhall.expected <$> alts ) ) in Dhall.Type { .. } validateType :: Dhall.Type ( Maybe a ) -> Dhall.Type a validateType a = a { Dhall.extract = join . Dhall.extract a } sortInsOrdHashMap :: Ord k => Map.Map k v -> Map.Map k v sortInsOrdHashMap = Map.fromList . sortBy ( comparing fst ) . Map.toList sortExpr :: Dhall.Expr s a -> Dhall.Expr s a sortExpr = \case Expr.RecordLit r -> Expr.RecordLit ( sortInsOrdHashMap r ) Expr.Record r -> Expr.Record ( sortInsOrdHashMap r ) Expr.Union r -> Expr.Union ( sortInsOrdHashMap r ) e -> e