Created
September 13, 2018 05:04
-
-
Save fragamus/1662aadf0929a9f9df97c1be9aaa8df4 to your computer and use it in GitHub Desktop.
deriving FromJSON and ToJSON for Literal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# LANGUAGE TemplateHaskell #-} | |
{-# LANGUAGE StandaloneDeriving #-} | |
{-# LANGUAGE ExplicitForAll #-} | |
{-# LANGUAGE OverloadedStrings #-} | |
{-# LANGUAGE DeriveGeneric #-} | |
{-# LANGUAGE DeriveAnyClass #-} | |
import Data.Aeson | |
import Data.Text | |
import Control.Applicative | |
import Control.Monad | |
import qualified Data.ByteString.Lazy as B | |
import Network.HTTP.Conduit (simpleHttp) | |
import GHC.Generics | |
import System.Environment | |
import Language.Haskell.Exts | |
import Language.Haskell.Exts.Pretty | |
deriving instance Generic Literal l | |
deriving instance ToJSON Literal l | |
deriving instance FromJSON Literal l | |
deriving instance Generic SrcSpanInfo | |
deriving instance ToJSON SrcSpanInfo | |
deriving instance FromJSON SrcSpanInfo | |
deriving instance Generic SrcSpan | |
deriving instance ToJSON SrcSpan | |
deriving instance FromJSON SrcSpan | |
main = do | |
let ind l n = if Prelude.length l > n then Just $ l !! n else Nothing | |
args <- getArgs | |
let file = ind args 0 | |
let inp = maybe getContents readFile file | |
fileContents <- inp | |
putStrLn fileContents | |
let ast = fromParseResult $ parseFileContents fileContents | |
putStrLn "ast:" | |
putStrLn $ show $ ast | |
let original = SrcSpanInfo {srcInfoSpan = SrcSpan "<unknown>.hs" 1 1 4 1, srcInfoPoints = [SrcSpan "<unknown>.hs" 1 1 1 1,SrcSpan "<unknown>.hs" 2 1 2 1,SrcSpan "<unknown>.hs" 2 1 2 1,SrcSpan "<unknown>.hs" 2 1 2 1,SrcSpan "<unknown>.hs" 4 1 4 1,SrcSpan "<unknown>.hs" 4 1 4 1]} | |
--let original = SrcSpan "<unknown>.hs" 1 1 4 1 | |
putStrLn "original:" | |
putStrLn $ show original | |
let encoded = encode original | |
putStrLn "encoded:" | |
print encoded | |
let eitherDecodedOrString = eitherDecode encoded :: Either String SrcSpanInfo | |
case eitherDecodedOrString of | |
Left s -> putStrLn s | |
Right decoded -> do | |
putStrLn "decoded:" | |
putStrLn $ show decoded | |
putStrLn $ show $ decoded == original |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment