packages feed

hydra-0.1.0: src/main/haskell/Hydra/Lib/Io.hs

module Hydra.Lib.Io (
  showTerm,
  showType,
  coreContext,
) where

import Hydra.All
import Hydra.Ext.Json.Coder
import qualified Hydra.Ext.Json.Model as Json
import Hydra.Impl.Haskell.Dsl.Standard
import qualified Hydra.Impl.Haskell.Dsl.Types as Types
import Hydra.Impl.Haskell.Ext.Json.Serde
import Hydra.CoreEncoding

import qualified Data.Map as M
import qualified Data.Maybe as Y


showTerm :: Ord m => Term m -> String
showTerm term = fromFlow coreContext $ coderEncode termStringCoder encoded
  where
    encoded = encodeTerm $ rewriteTermMeta (const $ Meta M.empty) term

termJsonCoder :: Coder (Context Meta) (Context Meta) (Term Meta) Json.Value
termJsonCoder = fromFlow coreContext $ jsonCoder $ Types.nominal _Term

termStringCoder :: Coder (Context Meta) (Context Meta) (Term Meta) String
termStringCoder = Coder mout min
  where
    mout term = valueToString <$> coderEncode termJsonCoder term
    min s = case stringToValue s of
      Left msg -> fail $ "failed to parse JSON value: " ++ msg
      Right v -> coderDecode termJsonCoder v

showType :: Ord m => Type m -> String
showType typ = fromFlow coreContext $ coderEncode typeStringCoder encoded
  where
    encoded = encodeType $ rewriteTypeMeta (const $ Meta M.empty) typ

typeJsonCoder :: Coder (Context Meta) (Context Meta) (Term Meta) Json.Value
typeJsonCoder = fromFlow coreContext $ jsonCoder $ Types.nominal _Type

typeStringCoder :: Coder (Context Meta) (Context Meta) (Term Meta) String
typeStringCoder = Coder mout min
  where
    mout term = valueToString <$> coderEncode typeJsonCoder term
    min s = case stringToValue s of
      Left msg -> fail $ "failed to parse as JSON value: " ++ msg
      Right v -> coderDecode typeJsonCoder v