module Examples.Simple.SizeInference where import qualified Prelude as P import Feldspar import Feldspar.Compiler hiding (setLength) -- This example shows that size inference works through `forLoop` if the step -- function does not increase the size of the state. reverse :: Type a => Data [a] -> Data [a] reverse a = forLoop l a $ \i a' -> setIx a' i (a ! (l-i-1)) where l = getLength a test_reverse = icompile $ reverse -:: tArr1 tI32 >-> id -:: notAbove 100 |> id >-> id -- This example shows that size inference fails if the step function increases -- the size of the state. reverseBad :: Type a => Data [a] -> Data [a] reverseBad a = forLoop l a $ \i a' -> setLength (l-1) $ setIx a' i (a ! (l-i-1)) where l = getLength a test_reverseBad = drawDecor $ reverseBad -:: tArr1 tI32 >-> id -:: notAbove 100 |> id >-> id