如何使用Heist在多个拼接中使用单个每请求计算?

时间:2013-03-12 22:13:10

标签: haskell haskell-snap-framework heist

假设我有一个包含两个自定义标记<x/><y/>的Heist模板。每个标记都绑定到Heist.Compiled.Splice。现在,模板将在每个GET请求中呈现特定路由。如何将<x/>替换为对的第一个值,<y/>替换为同一对的第二个值,但返回该对的IO计算每个请求仅运行一次(和只能在那条路线上运行,而不是在每条路线上运行,因为有些人根本不会使用模板)?

1 个答案:

答案 0 :(得分:1)

您的问题与compiled splices tutorial中的Person示例非常相似。您需要创建一个将执行共享计算的父拼接。称之为computeXY。您的模板如下所示:

<computeXY>
  <p>The first value is <x/>.</p>
  <p>The second value is <y/>.</p>
</computeXY>

computeXY拼接将执行计算并使用runChildrenWith模式将该计算的结果作为<x/><y/>标记提供给其子项。但是,runChildrenWith模式与编译的拼接有点不同。以下是使用自编写教程以来添加的新API函数实现它的方法:

import Blaze.ByteString.Builder.Char8 (fromText)
import Heist.Compiled

runtimeTupleComputation = return ("foo", "bar")

splices = [ ("x", fromText . fst)
          , ("y", fromText . snd)
          ]

computeXYSplice = withPureSplices runChildren splices runtimeTupleComputation