-- 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 :: forall cp.
(NiceParameterFull cp, NiceStorageFull cp) =>
Contract cp [cp] ()
contractConsumer = (IsNotInView => '[(cp, [cp])] :-> ContractOut [cp])
-> Contract cp [cp] ()
forall cp st.
(NiceParameterFull cp, NiceStorageFull st) =>
(IsNotInView => '[(cp, st)] :-> ContractOut st)
-> Contract cp st ()
defaultContract ((IsNotInView => '[(cp, [cp])] :-> ContractOut [cp])
 -> Contract cp [cp] ())
-> (IsNotInView => '[(cp, [cp])] :-> ContractOut [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]] :-> ContractOut [cp])
-> '[(cp, [cp])] :-> ContractOut [cp]
forall (a :: [*]) (b :: [*]) (c :: [*]).
(a :-> b) -> (b :-> c) -> a :-> c
# '[List Operation, [cp]] :-> ContractOut [cp]
forall a b (s :: [*]). (a : b : s) :-> ((a, b) : s)
pair