Skip to content

Commit 23775ab

Browse files
committed
Make 'genNaiveFib' generate bindings under 'Fix'
1 parent b406de2 commit 23775ab

File tree

1 file changed

+34
-16
lines changed

1 file changed

+34
-16
lines changed

plutus-core/testlib/PlutusCore/Generators/Hedgehog/Interesting.hs

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ import PlutusCore.StdLib.Data.Unit
4141
import PlutusCore.StdLib.Meta
4242
import PlutusCore.StdLib.Type
4343

44-
import Data.List (genericIndex)
44+
import Control.Monad.Morph (hoist)
45+
import Data.List (genericIndex, scanl')
4546
import Hedgehog hiding (Size, Var)
4647
import Hedgehog.Gen qualified as Gen
4748
import Hedgehog.Range qualified as Range
@@ -95,28 +96,39 @@ factorial = runQuote $ do
9596
-- > (\(u : unit) -> addInteger
9697
-- > (rec (subtractInteger i 1))
9798
-- > (rec (subtractInteger i 2))))
98-
naiveFib :: Integer -> Term TyName Name DefaultUni DefaultFun ()
99-
naiveFib iv = runQuote $ do
99+
getNaiveFib
100+
:: MonadQuote m
101+
=> [(VarDecl TyName Name DefaultUni (), Term TyName Name DefaultUni DefaultFun ())]
102+
-> Integer
103+
-> m (Term TyName Name DefaultUni DefaultFun ())
104+
getNaiveFib args iv = do
100105
rec <- freshName "rec"
101106
i <- freshName "i"
102107
u <- freshName "u"
103108
let
104109
intS = mkTyBuiltin @_ @Integer ()
105110
fib = Fix () rec (TyFun () intS intS)
106-
. LamAbs () i intS
107-
$ mkIterAppNoAnn (TyInst () ifThenElse intS)
108-
[ mkIterAppNoAnn (Builtin () LessThanEqualsInteger)
109-
[Var () i, mkConstant @Integer () 1]
110-
, LamAbs () u unit $ Var () i
111-
, LamAbs () u unit $ mkIterAppNoAnn (Builtin () AddInteger)
112-
[ Apply () (Var () rec) $ mkIterAppNoAnn (Builtin () SubtractInteger)
111+
. mkIterAppNoAnn
112+
( mkIterLamAbs (Prelude.map fst args)
113+
. LamAbs () i intS
114+
$ mkIterAppNoAnn (TyInst () ifThenElse intS)
115+
[ mkIterAppNoAnn (Builtin () LessThanEqualsInteger)
113116
[Var () i, mkConstant @Integer () 1]
114-
, Apply () (Var () rec) $ mkIterAppNoAnn (Builtin () SubtractInteger)
115-
[Var () i, mkConstant @Integer () 2]
117+
, LamAbs () u unit $ Var () i
118+
, LamAbs () u unit $ mkIterAppNoAnn (Builtin () AddInteger)
119+
[ Apply () (Var () rec) $ mkIterAppNoAnn (Builtin () SubtractInteger)
120+
[Var () i, mkConstant @Integer () 1]
121+
, Apply () (Var () rec) $ mkIterAppNoAnn (Builtin () SubtractInteger)
122+
[Var () i, mkConstant @Integer () 2]
123+
]
116124
]
117-
]
125+
)
126+
$ Prelude.map snd args
118127
pure . Apply () fib $ mkConstant @Integer () iv
119128

129+
naiveFib :: Integer -> Term TyName Name DefaultUni DefaultFun ()
130+
naiveFib = runQuote . getNaiveFib []
131+
120132
-- | Generate a term that computes the factorial of an @integer@ and return it
121133
-- along with the factorial of the corresponding 'Integer' computed on the Haskell side.
122134
genFactorial :: TermGen Integer
@@ -129,11 +141,17 @@ genFactorial = do
129141
-- | Generate a term that computes the ith Fibonacci number and return it
130142
-- along with the corresponding 'Integer' computed on the Haskell side.
131143
genNaiveFib :: TermGen Integer
132-
genNaiveFib = do
133-
let fibs = scanl (+) 0 $ 1 : fibs
144+
genNaiveFib = hoist (pure . runQuote) $ do
145+
let fibs = scanl' (+) 0 $ 1 : fibs
134146
m = 16
147+
argsN = 8
135148
iv <- Gen.integral $ Range.linear 0 m
136-
return . TermOf (naiveFib iv) $ fibs `genericIndex` iv
149+
args <- Gen.list (Range.linear 0 $ fromInteger argsN) $
150+
withAnyTermLoose $ \proxy@(TermOf arg _) -> do
151+
argName <- freshName "arg"
152+
pure (VarDecl () argName $ toTypeAst proxy, arg)
153+
fib <- getNaiveFib args iv
154+
return . TermOf fib $ fibs `genericIndex` iv
137155

138156
-- | Generate an 'Integer', turn it into a Scott-encoded PLC @Nat@ (see 'Nat'),
139157
-- turn that @Nat@ into the corresponding PLC @integer@ using a fold (see 'FoldNat')

0 commit comments

Comments
 (0)