module Json.Encode exposing
  ( Value
  , encode
  , string, int, float, bool, null
  , list, array
  , object
  )

{-| Library for turning Elm values into Json values.

# Encoding
@docs encode, Value

# Primitives
@docs string, int, float, bool, null

# Arrays
@docs list, array

# Objects
@docs object
-}

import Array exposing (Array)
import Native.Json


{-| Represents a JavaScript value.
-}
type Value = Value


{-| Convert a `Value` into a prettified string. The first argument specifies
the amount of indentation in the resulting string.

    person =
        object
          [ ("name", string "Tom")
          , ("age", int 42)
          ]

    compact = encode 0 person
    -- {"name":"Tom","age":42}

    readable = encode 4 person
    -- {
    --     "name": "Tom",
    --     "age": 42
    -- }
-}
encode : Int -> Value -> String
encode =
    Native.Json.encode


{-|-}
string : String -> Value
string =
    Native.Json.identity


{-|-}
int : Int -> Value
int =
    Native.Json.identity


{-| Encode a Float. `Infinity` and `NaN` are encoded as `null`.
-}
float : Float -> Value
float =
    Native.Json.identity


{-|-}
bool : Bool -> Value
bool =
    Native.Json.identity


{-|-}
null : Value
null =
    Native.Json.encodeNull


{-|-}
object : List (String, Value) -> Value
object =
    Native.Json.encodeObject


{-|-}
array : Array Value -> Value
array =
    Native.Json.encodeArray


{-|-}
list : List Value -> Value
list =
    Native.Json.encodeList
