module JSONAST.JSONEncoder where import BasePrelude hiding (null) import JSONEncoder import JSONAST import Data.Vector (Vector) import Data.Text (Text) import Data.Scientific (Scientific) import Data.HashMap.Strict (HashMap) import Data.Functor.Contravariant import Data.Functor.Contravariant.Divisible import Contravariant.Extras import qualified Data.HashMap.Strict as HashMap json :: Value JSON json = contramap match $ chosen jsonObject $ chosen jsonArray $ chosen jsonString $ chosen jsonNumber $ chosen jsonBoolean $ jsonNull where match = \case JSON_Object x -> Left x JSON_Array x -> Right (Left x) JSON_String x -> Right (Right (Left x)) JSON_Number x -> Right (Right (Right (Left x))) JSON_Bool x -> Right (Right (Right (Right (Left x)))) _ -> Right (Right (Right (Right (Right ())))) jsonObject :: Value (HashMap Text JSON) jsonObject = object $ contramap HashMap.toList $ contramany $ row json jsonArray :: Value (Vector JSON) jsonArray = array $ homo foldl' json jsonString :: Value Text jsonString = string jsonNumber :: Value Scientific jsonNumber = number_scientific jsonBoolean :: Value Bool jsonBoolean = boolean jsonNull :: Value () jsonNull = null