mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-03-25 19:32:11 +01:00
haskell: finish template-haskell deriving implement
This commit is contained in:
parent
6aa196cf55
commit
93bed9c5df
@ -15,6 +15,10 @@ Stability: Experimental
|
|||||||
Cabal-Version: >= 1.6
|
Cabal-Version: >= 1.6
|
||||||
Build-Type: Simple
|
Build-Type: Simple
|
||||||
|
|
||||||
|
Extra-source-files:
|
||||||
|
test/Test.hs
|
||||||
|
test/UserData.hs
|
||||||
|
|
||||||
Library
|
Library
|
||||||
Build-depends: base >=4 && <5,
|
Build-depends: base >=4 && <5,
|
||||||
transformers >= 0.2.1 && < 0.2.2,
|
transformers >= 0.2.1 && < 0.2.2,
|
||||||
|
@ -11,10 +11,11 @@ import Language.Haskell.TH
|
|||||||
|
|
||||||
import Data.MessagePack.Pack
|
import Data.MessagePack.Pack
|
||||||
import Data.MessagePack.Unpack
|
import Data.MessagePack.Unpack
|
||||||
|
import Data.MessagePack.Object
|
||||||
|
|
||||||
deriveUnpack :: Name -> Q [Dec]
|
deriveUnpack :: Name -> Q [Dec]
|
||||||
deriveUnpack typName = do
|
deriveUnpack typName = do
|
||||||
TyConI (DataD cxt name tyVarBndrs cons names) <- reify typName
|
TyConI (DataD _ name _ cons _) <- reify typName
|
||||||
|
|
||||||
return
|
return
|
||||||
[ InstanceD [] (AppT (ConT ''Unpackable) (ConT name))
|
[ InstanceD [] (AppT (ConT ''Unpackable) (ConT name))
|
||||||
@ -24,20 +25,19 @@ deriveUnpack typName = do
|
|||||||
where
|
where
|
||||||
body (NormalC conName elms) =
|
body (NormalC conName elms) =
|
||||||
DoE
|
DoE
|
||||||
[ BindS (tupOrList $ map VarP names) (VarE 'get)
|
[ BindS (tupOrListP $ map VarP names) (VarE 'get)
|
||||||
, NoBindS $ AppE (VarE 'return) $ foldl AppE (ConE conName) $ map VarE names ]
|
, NoBindS $ AppE (VarE 'return) $ foldl AppE (ConE conName) $ map VarE names ]
|
||||||
where
|
where
|
||||||
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
||||||
|
|
||||||
tupOrList ls
|
body (RecC conName elms) =
|
||||||
| length ls <= 1 = ListP ls
|
body (NormalC conName $ map (\(_, b, c) -> (b, c)) elms)
|
||||||
| otherwise = TupP ls
|
|
||||||
|
|
||||||
ch = foldl1 (\e f -> AppE (AppE (VarE '(<|>)) e) f)
|
ch = foldl1 (\e f -> AppE (AppE (VarE '(<|>)) e) f)
|
||||||
|
|
||||||
derivePack :: Name -> Q [Dec]
|
derivePack :: Name -> Q [Dec]
|
||||||
derivePack typName = do
|
derivePack typName = do
|
||||||
TyConI (DataD cxt name tyVarBndrs cons names) <- reify typName
|
TyConI (DataD _ name _ cons _) <- reify typName
|
||||||
|
|
||||||
return
|
return
|
||||||
[ InstanceD [] (AppT (ConT ''Packable) (ConT name))
|
[ InstanceD [] (AppT (ConT ''Packable) (ConT name))
|
||||||
@ -48,27 +48,53 @@ derivePack typName = do
|
|||||||
body (NormalC conName elms) =
|
body (NormalC conName elms) =
|
||||||
Clause
|
Clause
|
||||||
[ ConP conName $ map VarP names ]
|
[ ConP conName $ map VarP names ]
|
||||||
(NormalB $ AppE (VarE 'put) $ tupOrList $ map VarE names) []
|
(NormalB $ AppE (VarE 'put) $ tupOrListE $ map VarE names) []
|
||||||
where
|
where
|
||||||
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
||||||
|
|
||||||
tupOrList ls
|
body (RecC conName elms) =
|
||||||
| length ls <= 1 = ListE ls
|
body (NormalC conName $ map (\(_, b, c) -> (b, c)) elms)
|
||||||
| otherwise = TupE ls
|
|
||||||
|
|
||||||
deriveObject :: Name -> Q [Dec]
|
deriveObject :: Name -> Q [Dec]
|
||||||
deriveObject typName = do
|
deriveObject typName = do
|
||||||
g <- derivePack typName
|
g <- derivePack typName
|
||||||
p <- deriveUnpack typName
|
p <- deriveUnpack typName
|
||||||
{-
|
|
||||||
TyConI (DataD cxt name tyVarBndrs cons names) <- reify typName
|
TyConI (DataD _ name _ cons _) <- reify typName
|
||||||
let o = InstanceD [] (AppT (ConT ''OBJECT) (ConT name))
|
let o = InstanceD [] (AppT (ConT ''OBJECT) (ConT name))
|
||||||
[ FunD 'toObject (map toObjectBody cons) ]
|
[ FunD 'toObject (map toObjectBody cons),
|
||||||
-}
|
FunD 'tryFromObject [Clause [ VarP oname ]
|
||||||
return $ g ++ p -- ++ [o]
|
(NormalB $ ch $ map tryFromObjectBody cons) []]]
|
||||||
{-
|
|
||||||
|
return $ g ++ p ++ [o]
|
||||||
where
|
where
|
||||||
toObjectBody (NormalC conName elms) =
|
toObjectBody (NormalC conName elms) =
|
||||||
Clause
|
Clause
|
||||||
[ ConP conP
|
[ ConP conName $ map VarP names ]
|
||||||
-}
|
(NormalB $ AppE (VarE 'toObject) $ tupOrListE $ map VarE names) []
|
||||||
|
where
|
||||||
|
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
||||||
|
toObjectBody (RecC conName elms) =
|
||||||
|
toObjectBody (NormalC conName $ map (\(_, b, c) -> (b, c)) elms)
|
||||||
|
|
||||||
|
tryFromObjectBody (NormalC conName elms) =
|
||||||
|
DoE
|
||||||
|
[ BindS (tupOrListP $ map VarP names) (AppE (VarE 'tryFromObject) (VarE oname))
|
||||||
|
, NoBindS $ AppE (VarE 'return) $ foldl AppE (ConE conName) $ map VarE names ]
|
||||||
|
where
|
||||||
|
names = zipWith (\ix _ -> mkName $ "a" ++ show (ix :: Int)) [1..] elms
|
||||||
|
tryFromObjectBody (RecC conName elms) =
|
||||||
|
tryFromObjectBody (NormalC conName $ map (\(_, b, c) -> (b, c)) elms)
|
||||||
|
|
||||||
|
oname = mkName "o"
|
||||||
|
ch = foldl1 (\e f -> AppE (AppE (VarE '(<|>)) e) f)
|
||||||
|
|
||||||
|
tupOrListP :: [Pat] -> Pat
|
||||||
|
tupOrListP ls
|
||||||
|
| length ls <= 1 = ListP ls
|
||||||
|
| otherwise = TupP ls
|
||||||
|
|
||||||
|
tupOrListE :: [Exp] -> Exp
|
||||||
|
tupOrListE ls
|
||||||
|
| length ls <= 1 = ListE ls
|
||||||
|
| otherwise = TupE ls
|
||||||
|
@ -7,7 +7,7 @@ import qualified Data.ByteString.Char8 as B
|
|||||||
import qualified Data.ByteString.Lazy.Char8 as L
|
import qualified Data.ByteString.Lazy.Char8 as L
|
||||||
import Data.MessagePack
|
import Data.MessagePack
|
||||||
|
|
||||||
mid :: (ObjectGet a, ObjectPut a) => a -> a
|
mid :: (Packable a, Unpackable a) => a -> a
|
||||||
mid = unpack . pack
|
mid = unpack . pack
|
||||||
|
|
||||||
prop_mid_int a = a == mid a
|
prop_mid_int a = a == mid a
|
||||||
|
@ -10,6 +10,13 @@ data T
|
|||||||
|
|
||||||
$(deriveObject ''T)
|
$(deriveObject ''T)
|
||||||
|
|
||||||
|
data U
|
||||||
|
= C { c1 :: Int, c2 :: String }
|
||||||
|
| D { d1 :: Double }
|
||||||
|
deriving (Show)
|
||||||
|
|
||||||
|
$(deriveObject ''U)
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
let bs = pack $ A 123 "hoge"
|
let bs = pack $ A 123 "hoge"
|
||||||
print bs
|
print bs
|
||||||
@ -17,3 +24,22 @@ main = do
|
|||||||
let cs = pack $ B 3.14
|
let cs = pack $ B 3.14
|
||||||
print cs
|
print cs
|
||||||
print (unpack cs :: T)
|
print (unpack cs :: T)
|
||||||
|
let oa = toObject $ A 123 "hoge"
|
||||||
|
print oa
|
||||||
|
print (fromObject oa :: T)
|
||||||
|
let ob = toObject $ B 3.14
|
||||||
|
print ob
|
||||||
|
print (fromObject ob :: T)
|
||||||
|
|
||||||
|
let ds = pack $ C 123 "hoge"
|
||||||
|
print ds
|
||||||
|
print (unpack ds :: U)
|
||||||
|
let es = pack $ D 3.14
|
||||||
|
print es
|
||||||
|
print (unpack es :: U)
|
||||||
|
let oc = toObject $ C 123 "hoge"
|
||||||
|
print oc
|
||||||
|
print (fromObject oc :: U)
|
||||||
|
let od = toObject $ D 3.14
|
||||||
|
print od
|
||||||
|
print (fromObject od :: U)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user