-- SPDX-FileCopyrightText: 2021 Oxhead Alpha
-- SPDX-License-Identifier: LicenseRef-MIT-OA

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

import Lorentz.Base
import Lorentz.Constraints
import Lorentz.Instr
import Lorentz.Run

-- | Remembers parameters it was called with, last goes first.
contractConsumer :: (NiceParameterFull cp, NiceStorageFull cp) => Contract cp [cp] ()
contractConsumer :: Contract cp [cp] ()
contractConsumer = ContractCode cp [cp] -> Contract cp [cp] ()
forall cp st.
(NiceParameterFull cp, NiceStorageFull 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