1
1
mirror of https://github.com/juspay/jrec.git synced 2024-08-15 13:20:50 +03:00
jrec/bin/genrecord
kamoii 433713feec Add unsafeGet function and re-implement toTuple with it
An attempt to improve JRec.Tuple compile time.
2020-10-28 21:52:45 +09:00

74 lines
2.1 KiB
Plaintext
Executable File

#!/usr/bin/env cabal
{-# LANGUAGE OverloadedStrings #-}
{- cabal:
build-depends: base, fmt
-}
import Data.List
import Fmt
main = do
let n = 62 -- max tuple size
putStrLn
"-- Generated with cabal run -v0 bin/genrecord > src/JRec/Tuple.hs\n\
\\n\
\module JRec.Tuple where\n\
\\n\
\import qualified JRec.Internal as R\n\
\import Unsafe.Coerce\n\
\\n\
\class RecTuple tuple fields | tuple -> fields, fields -> tuple where\n\
\ fromTuple :: tuple -> R.Rec fields\n\
\ toTuple :: R.Rec fields -> tuple\n\
\\n\
\"
mapM_ (putStrLn . genInstance) [0 .. n]
genInstance :: Int -> String
genInstance 0 =
"instance RecTuple () '[] where\n\
\ fromTuple _ = R.rnil\n\
\ toTuple _ = ()\n\
\"
genInstance i =
let fromTuple, toTuple, constraints :: Builder
fromTuple =
format
"fromTuple {} = R.create $ {} R.unsafeRNil {}"
exprTuple
consApps
i
toTuple =
format
"toTuple r = let n = R.FldProxy :: R.FldProxy \"\" in unsafeCoerce {}"
exprGetTuple
constraints =
tupleF $
[format "n{} ~ n{}'" j j :: Builder | j <- [1 .. i]]
++ [format "v{} ~ v{}'" j j :: Builder | j <- [1 .. i]]
in format
"instance {} => RecTuple {} {} where\n\
\ {}\n\
\ {}\n\
\"
constraints
typeTuple
typeList
fromTuple
toTuple
where
-- '[n1' R.:= v1', n2' R.:= v2']
typeList = "'" <> listF [format "n{}' R.:= v{}'" j j :: Builder | j <- [1 .. i]]
-- (n1 R.:= v1, n2 R.:= v2)
typeTuple = tupleF [format "n{} R.:= v{}" j j :: Builder | j <- [1 .. i]]
-- (f1, f2)
exprTuple = tupleF ["f" <> show j | j <- [1 .. i]]
-- [f1, f2]
exprList = listF ["f" <> show j | j <- [1 .. i]]
-- R.unsafeRCons f1 $ R.unsafeRCons f2 $
consApps = mconcat [format "R.unsafeRCons f{} =<< " j :: Builder | j <- [1 .. i]]
-- (n R.:= R.unsafeGet 0 r, n R.:= R.unsafeGet 1 r)
exprGetTuple = tupleF [format "n R.:= R.unsafeGet {} r" j :: Builder | j <- [0 .. i-1]]