-----------------------------------------------------------------------------
-- |
-- Module      :  Text.JSON.ToJSON
-- Copyright   :  (c) Scrive 2011
-- License     :  BSD-style (see the LICENSE file in the distribution)
--
-- Maintainer  :  mariusz@scrive.com
-- Stability   :  development
-- Portability :  portable
--
-- Unifing some structures so they can be serialized to JSValue
--


module Text.JSON.ToJSValue (ToJSValue(..))where

import Text.JSON
import Data.Map as M

class ToJSValue a where
  toJSValue :: a -> JSValue

instance ToJSValue JSValue where
  toJSValue = id

instance ToJSValue Bool where
  toJSValue = JSBool

instance ToJSValue String where
  toJSValue = JSString . toJSString

instance Real a => ToJSValue a where
  toJSValue = JSRational True . toRational

instance ToJSValue a => ToJSValue [a] where
  toJSValue = JSArray . fmap toJSValue

instance ToJSValue a => ToJSValue (M.Map String a) where
  toJSValue = JSObject . toJSObject . M.toList . fmap toJSValue

instance ToJSValue a => ToJSValue (Maybe a) where
  toJSValue = maybe JSNull toJSValue

instance (ToJSValue a, ToJSValue b) => ToJSValue (a,b) where
  toJSValue (a,b) = JSArray [toJSValue a, toJSValue b]