packages feed

technique-0.2.5: tests/ExampleProcedure.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}

module ExampleProcedure where

import Core.Program.Execute hiding (None)
import Core.Program.Logging
import Core.Text.Rope ()
import Core.Text.Utilities ()
import Technique.Formatter ()
import Technique.Language
import Technique.Quantity

-- Render instances for main function

{-
    roast_turkey i : Ingredients -> Turkey
    {
        @chef
        {
            preheat = oven (180 °C)
            task "Bacon strips onto bird"
            preheat

            task "Put bird into oven"

            t = timer (3 h)
            t

            temp = record "Probe bird temperature"
            [
                "Final temperature" ~ temp
            ]
        }
-}

exampleProcedureOven :: Procedure
exampleProcedureOven =
  emptyProcedure
    { procedureName = Identifier "oven",
      procedureInput = [Type "Temperature"],
      procedureOutput = [Type "()"], -- ?
      procedureBlock = Block [Execute 0 (Application 0 (Identifier "task") (Text 0 "Set oven temperature!"))]
    }

exampleRoastTurkey :: Procedure
exampleRoastTurkey =
  let i = Type "Ingredients"
      o = Type "Turkey"
      celsius = "°C"
      chef = Role (Identifier "chef")
      block =
        Block
          [ Execute
              0
              ( Restriction
                  0
                  chef
                  ( Block
                      [ Assignment
                          0
                          [Identifier "preheat"]
                          ( Application
                              0
                              (Identifier "oven")
                              (Grouping 0 (Amount 0 (Quantity (Decimal 180 0) (Decimal 0 0) 0 celsius)))
                          ),
                        Execute
                          0
                          ( Application
                              0
                              (Identifier "task")
                              (Text 0 "Bacon strips onto bird")
                          ),
                        Execute
                          0
                          (Variable 0 [Identifier "preheat"]),
                        Execute
                          0
                          (Undefined 0),
                        Blank 0,
                        Execute
                          0
                          ( Operation
                              0
                              WaitBoth
                              (Variable 0 [Identifier "w1"])
                              ( Grouping
                                  0
                                  ( Operation
                                      0
                                      WaitEither
                                      (Variable 0 [Identifier "w2"])
                                      (Variable 0 [Identifier "w3"])
                                  )
                              )
                          ),
                        Blank 0,
                        Execute 0 (Variable 0 [Identifier "v1"]),
                        Series 0,
                        Execute 0 (Variable 0 [Identifier "v2"]),
                        Assignment
                          0
                          [Identifier "temp"]
                          ( Application
                              0
                              (Identifier "record")
                              (Text 0 "Probe bird temperature")
                          ),
                        Execute
                          0
                          ( Object
                              0
                              ( Tablet
                                  [Binding (Label "Final temperature") (Variable 0 [Identifier "temp"])]
                              )
                          )
                      ]
                  )
              )
          ]
   in Procedure
        { procedureOffset = 0,
          procedureName = Identifier "roast_turkey",
          procedureParams = [Identifier "i", Identifier "j", Identifier "k"],
          procedureInput = [i],
          procedureOutput = [o],
          procedureTitle = Just (Markdown "Roast Turkey"),
          procedureDescription = Nothing,
          procedureBlock = block
        }

exampleTechnique :: Technique
exampleTechnique =
  Technique
    { techniqueVersion = 0,
      techniqueLicense = "BSD-3-Clause",
      techniqueCopyright = Just "2018 Allicin Wonderland",
      techniqueBody = [exampleRoastTurkey]
    }

main :: IO ()
main = execute $ do
  writeR exampleTechnique