Blame examples/TemplateHaskell.hs
|
Packit |
9a2dfb |
-- We can use Template Haskell (TH) to generate instances of the
|
|
Packit |
9a2dfb |
-- FromJSON and ToJSON classes automatically. This is the fastest way
|
|
Packit |
9a2dfb |
-- to add JSON support for a type.
|
|
Packit |
9a2dfb |
{-# LANGUAGE OverloadedStrings #-}
|
|
Packit |
9a2dfb |
{-# LANGUAGE TemplateHaskell #-}
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
module Main (main) where
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
import Prelude ()
|
|
Packit |
9a2dfb |
import Prelude.Compat
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
import Data.Aeson (decode, encode)
|
|
Packit |
9a2dfb |
import Data.Aeson.TH (deriveJSON, defaultOptions)
|
|
Packit |
9a2dfb |
import qualified Data.ByteString.Lazy.Char8 as BL
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
data Coord = Coord { x :: Double, y :: Double }
|
|
Packit |
9a2dfb |
deriving (Show)
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
-- This splice will derive instances of ToJSON and FromJSON for us.
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
$(deriveJSON defaultOptions ''Coord)
|
|
Packit |
9a2dfb |
|
|
Packit |
9a2dfb |
main :: IO ()
|
|
Packit |
9a2dfb |
main = do
|
|
Packit |
9a2dfb |
let req = decode "{\"x\":3.0,\"y\":-1.0}" :: Maybe Coord
|
|
Packit |
9a2dfb |
print req
|
|
Packit |
9a2dfb |
let reply = Coord { x = 123.4, y = 20 }
|
|
Packit |
9a2dfb |
BL.putStrLn (encode reply)
|