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
]