There's no way to get homogeneous objects in Purescript due to limitations in the type system. This library provides homogeneous JSON-like objects where the keys are all String
types and the values all have the same type (homegeneous) that you specified. You can think of this as analagous to a typed array except for objects. It comes in three flavors:
A TupleTree is just a tree representation of the Tuple
type from purescript-tuples with a String
as the first argument to represent the key in the key/value pair:
data TupleTree a = Leaf a | Branch (Array (Tuple String (TupleTree a)))
You can construct one with the mkTree
function:
sampleTree :: TupleTree Int
sampleTree = mkTree [ "foo" -= 3
, "bar" -< [ "baz" -= 4 ]
]
The -<
and -=
combinators are syntactic sugar to make your tree representation easy to read. The -<
combinator is used for Branch
nodes, and -=
is used for Leaf
nodes.
You can construct a Json
type from the purescript-argonaut package using the same -<
and -=
combinators but constructed with hJson
. You must provide an instance of the EncodeJson
typeclass for your homogeneous type if it doesn't already exist in order to be able to construct a Json
type:
sampleJson :: Json
sampleJson = hJson [ "foo" -= (Just 1)
, "bar" -< [ "baz" -= Nothing
, "qux" -< [ "norf" -= (Just 2) ]
]
, "worble" -= (Just 3)
]
For situations where you don't want to use Json
but you want to underlying representation to be a JSON object, you can use HObject
. This is useful for situations where you have more complex types that strict Json
doesn't support, but you still want a JSON representation internally for use in the FFI. It is constructed with hObj
:
data SampleType = StrType | NumType | BoolType
-- | This show instance makes (HObject SampleType) serializable
instance showSampleType :: Show SampleType where
show StrType = "[Fn String]"
show NumType = "[Fn Number]"
show BoolType = "[Fn Boolean]"
sampleHObj :: HObject SampleType
sampleHObj = hObj [ "foo" -= StrType
, "bar" -< [ "baz" -= BoolType ]
, "qux" -= NumType
]