packages feed

jsonnet-0.1.0.0: src/Language/Jsonnet/Std.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}

module Language.Jsonnet.Std
  ( std,
  )
where

import Control.Monad.Except
import Language.Jsonnet.Annotate
import Language.Jsonnet.Desugar
import Language.Jsonnet.Error
import Language.Jsonnet.Eval
import Language.Jsonnet.Eval (mergeWith)
import Language.Jsonnet.Eval.Monad
import qualified Language.Jsonnet.Std.Lib as Lib
import Language.Jsonnet.Std.TH (mkStdlib)
import Language.Jsonnet.Value
import Prelude hiding (length)

-- the jsonnet stdlib is written in both jsonnet and Haskell, here we merge
-- the native (small, Haskell) with the interpreted (the splice mkStdlib)
std :: ExceptT Error IO Value
std = do
  ast <- pure $(mkStdlib)
  core <- pure $ desugar (annMap (const ()) ast)
  runEval emptyEnv (eval core >>= flip mergeObjects Lib.std)
  where
    mergeObjects (VObj x) (VObj y) = pure $ VObj (x `mergeWith` y)