-- SPDX-FileCopyrightText: 2020 Tocqueville Group
--
-- SPDX-License-Identifier: LicenseRef-MIT-TQ

-- | Contract which remembers all parameters it has been called with.
--
-- Useful to save return values of @View@ entry points.
module Lorentz.Test.Consumer
  ( contractConsumer
  ) where

import Lorentz.Base
import Lorentz.Instr
import Lorentz.Macro
import Lorentz.Run

-- | Remembers parameters it was called with, last goes first.
contractConsumer :: Contract cp [cp]
contractConsumer :: Contract cp [cp]
contractConsumer = ContractCode cp [cp] -> Contract cp [cp]
forall cp st. ContractCode cp st -> Contract cp st
defaultContract (ContractCode cp [cp] -> Contract cp [cp])
-> ContractCode cp [cp] -> Contract cp [cp]
forall a b. (a -> b) -> a -> b
$
  ((cp, [cp]) & '[]) :-> (cp & ([cp] & '[]))
forall a b (s :: [*]). ((a, b) & s) :-> (a & (b & s))
unpair (((cp, [cp]) & '[]) :-> (cp & ([cp] & '[])))
-> ((cp & ([cp] & '[])) :-> ([cp] & '[]))
-> ((cp, [cp]) & '[]) :-> ([cp] & '[])
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
# (cp & ([cp] & '[])) :-> ([cp] & '[])
forall a (s :: [*]). (a & (List a & s)) :-> (List a & s)
cons (((cp, [cp]) & '[]) :-> ([cp] & '[]))
-> (([cp] & '[]) :-> (List Operation & ([cp] & '[])))
-> ((cp, [cp]) & '[]) :-> (List Operation & ([cp] & '[]))
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
# ([cp] & '[]) :-> (List Operation & ([cp] & '[]))
forall p (s :: [*]). KnownValue p => s :-> (List p & s)
nil (((cp, [cp]) & '[]) :-> (List Operation & ([cp] & '[])))
-> ((List Operation & ([cp] & '[]))
    :-> ((List Operation, [cp]) & '[]))
-> ContractCode cp [cp]
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
# (List Operation & ([cp] & '[])) :-> ((List Operation, [cp]) & '[])
forall a b (s :: [*]). (a & (b & s)) :-> ((a, b) & s)
pair