I am hoping that this example is small, simple and well commented enough to
help people generate instances with TH.
The instance generation is used to create instances to render haskell code
to TH code that generates the original haskell code.
there is an example in Test.hs
The instance generation function is in Base.hs. TH_Render.hs is where the
instances are derived.
Rene.
begin 666 TH_render.hs
M>RTC($]05$E/3E,@+69G;&%S9V]W+65X=',@+69T:" C+7T-"GLM(R!/4%1)
M3TY3("UF86QL;W6YT87@-"@T*:6UP;W)T(%1(7W1O;VQS+D)A2!N
M=6UB97(@;V8@87)G=65M96YT' @82!R('=H97)E#0H@(" @8G5I;&0G(#HZ($AS17AP("T^(&$@
M+3X@<@T*#0II;G-T86YC92 H5$A?4F5N9&5R(&$I(#T^($)U:6QD2'-%>' @
M82!(' @8B!R*2 ]/B!"=6EL9$AS17AP(&$@*&(M
M/G(I('=H97)E#0H@(" @8G5I;&0G(&P@>"!Y(#T@8G5I;&0G("A("DI("!Y#0H-"B M+6)U:6QD(#HZ(&9O" ](&)U:6QD
M)R H9G5N8U]O=70@9G5N8RD@> T*#0IF=6YC7V]U="!F(#T@2'-687(@)"!5
M;E%U86P@)"!(2!W:&5R90T*(" @' -"B @(')E;F1E7!E*2!W:&5R90T*
M("!R96YD97(@*&YA;64L('-T7!E(&YA;64@*'-T6)E($5X<"D@=VAE7!E
M*2!W:&5R90T*("!R96YD97(@*'-T7!E('-T7 -"@T*:6YS=&%N8V4@5$A?4F5N9&5R("A'=6%R
M9"P@17AP*2!W:&5R90T*(" @' L(&5X<"D@
M/2!B=6EL9" G;F]R;6%L1T4@9V5X<"!E>' -"B @(')E;F1E'1S(#T@2'-0
M87)E;B D("AF=6YC7V]U=" G8WAT*2!@2'-!<'!@("A(RTC($]05$E/3E,@+69G;&%S9V]W+65X=',@+69T:" C+7T-"FUO9'5L92!4
M2%]T;V]L6YT87@-"@T*:6UP
M;W)T($1A=&$N0VAA<@T*#0II;G-T86YC92!3:&]W($EN9F\@=VAEV0@/"T@7!E26YF;R!M(#T-"B @(" @9&\@9" \+2!M#0H@(" @
M(" @(&-A7!E1"!?(%\@7R!C(%\I(#T@6R!T97)M02!C(%T-"@T*(" @(" @("!T97)M
M02 H3F]R;6%L0R!C('AS*2 @(" @(" @/2 H8RP@;6%P("A<>" M/B H3F]T
M:&EN9RP@',I(" @(" @(" @(" @/2 H',I#0H@(" @(" @(&-O;D$@*$EN9FEX0R!?(&,@7RD@(" @(" @
M(" ]("AS:6UP;&5.86UE(&,L(#(I#0H-"B @(" @(" @;F%M92 H1&%T840@
M7R!N(%\@7R!?*2 @(" @(#T@;@T*(" @(" @("!N86UE("A.97=T>7!E1"!?
M(&X@7R!?(%\I(" @/2!N#0H@(" @(" @(&YA;64@9" @(" @(" @(" @(" @
M(" @(" @(" ](&5R7!E($9U;F-?;F%M92 ]($YA;64-"G1Y<&4@0V]N7!E*5TI#0IT>7!E($-O;G-?
M=F%R'!170T*='EP92!&=6YC=&EO;E]B;V1Y(#T@17AP40T*='EP
M92!'96Y?9G5N8R ]($-O;G-T7!E($9U;F-S(#T@6RA&=6YC7VYA;64L($=E;E]F=6YC
M*5T@#0H-"BTM(&-O;G-T7!E(&9O7!E#0HM+2!F=6YC7!E*0T*(" @
M("AM87 @9G5N8U]D968@9G5N8W,I( T*(" @(" @=VAE'!172 M/B!%>'!1
M*2 M/B!#;VYS=')U8W1O2!D871A7V-O;D H8V]N7VYA;64L(&-O;7!O;F5N=',I(#T@#0H@(" @
M(" M+2!C2D@/2 H=&],;W=EF4@
M.CH@6T-H87)=("T^(%M#:&%R70T*=6Y#87!A;&EZ92 H>#IY*2 ]("AT;TQO
M=V5R('@I.GD-"@T*+2T@1V5N97)A=&4@86X@:6YT86YC92!O9B!T:&4@8VQA
M7!.86UE#0IG96Y?7!.86UE(#T-"B @
M9&\@*%1Y0V]N22!D*2 \+2!R96EF>2!T>7!.86UE("TM($=E="!A;&P@=&AE
M(&EN9F]R;6%T:6]N(&]N('1H92!T>7!E#0H@(" @("AT>7!E7VYA;64L7RQ?
M+&-O;G-T'1R
M86-T(&YA;64@86YD(&-O;G-T2!F
M;W(@82!P87)T:6-U;&%R(&9U;F-T:6]N#0H@(" @(" @(" @(" @+2T@86YD
M(&-O;G-TRTC($]05$E/3E,@+69G;&%S9V]W+65X=',@+69T:" C+7T-"FUO9'5L92!4
M2%]T;V]L6YT87@-"@T*:6UP
M;W)T($QA;F=U86=E+DAA T*#0II;7!O7!E(%1E7!E72E=#0IT>7!E7V-O;7!S('1Y<&5?9&5C(#T-"B @("!D;R H5'E#
M;VY)(&0I(#PM('1Y<&5?9&5C#0H@(" @(" @*%\L7RQ?+&1E=&%I;',I(#PM
M('1Y<&5);F9O("AR971U#,@/2 D*&1O(&]U=" \+2 @='EP95]C;VUP7!E(%1EC4@/2!;9'P@>" ](#%\70T*>C8@/2!P2!Z('HI(@T*<#0@/2!P87)S94UO9'5L92 B
M>2 ](%LQ+#(L,UTB#0H-"G R("A087)S94]K(' I(#T@<')E='1Y4')I;G0@
M< T*#0IP,R ](' R(' Q#0H-"G(Q(#HZ(%$@26YF;PT*2 G
M)T1E8PT*" ]("0H2 G)T1E8R @/CX](&QI9G0@+B!S
M:&]W("X@='EP94EN9F\@+B!T>6-O;FDI#0H-"G@T(#T@)"AD;R H5'E#;VY)
M(&0I(#PM(')E:69Y("2 ^/CT@;&EF=" N('!P
MC@@/2!P"D@/2!(2D@/2!("D@?%T-"BTM(&]U
M='!U="!O9B!F=6YC=&EO;B!Z. T*)"AS97%U96YC92!;*&EN