rock-0.1.0.0: examples/Spreadsheet.hs
{-# language GADTs #-}
{-# language NoImplicitPrelude #-}
{-# language OverloadedStrings #-}
{-# language StandaloneDeriving #-}
{-# language TemplateHaskell #-}
import Protolude
import Data.GADT.Compare.TH (deriveGEq, deriveGCompare)
import qualified Rock
data Query a where
A :: Query Integer
B :: Query Integer
C :: Query Integer
D :: Query Integer
deriving instance Show (Query a)
deriveGEq ''Query
deriveGCompare ''Query
rules :: Rock.Rules Query
rules key = do
putText $ "Fetching " <> show key
case key of
A -> pure 10
B -> do
a <- Rock.fetch A
pure $ a + 20
C -> do
a <- Rock.fetch A
pure $ a + 30
D ->
(+) <$> Rock.fetch B <*> Rock.fetch C
main :: IO ()
main = do
do
putText "Running"
result <- Rock.runTask Rock.sequentially rules (Rock.fetch D)
print result
do
putText "Running with memoisation"
memoVar <- newMVar mempty
result <-
Rock.runTask
Rock.sequentially
(Rock.memoise memoVar rules)
(Rock.fetch D)
print result
do
putText "Running with memoisation using the parallel strategy"
memoVar <- newMVar mempty
result <-
Rock.runTask
Rock.inParallel
(Rock.memoise memoVar rules)
(Rock.fetch D)
print result