{-# LANGUAGE TypeFamilies #-}
module Synthesizer.LLVM.Frame.SerialVector.Plain (
T(Cons),
fromList,
replicate,
iterate,
) where
import qualified Synthesizer.LLVM.Frame.SerialVector.Code as Code
import Synthesizer.LLVM.Frame.SerialVector.Code (T)
import qualified LLVM.Core as LLVM
import qualified Type.Data.Num.Decimal as TypeNum
import qualified Data.NonEmpty.Class as NonEmptyC
import qualified Data.NonEmpty as NonEmpty
import Prelude as P hiding (zip, unzip, last, reverse, iterate, replicate)
fromList :: (TypeNum.Positive n) => NonEmpty.T [] a -> T n a
fromList = Code.Cons . LLVM.cyclicVector
replicate :: (TypeNum.Positive n) => a -> T n a
replicate = Code.Cons . pure
iterate :: (TypeNum.Positive n) => (a -> a) -> a -> T n a
iterate f x = fromList $ NonEmptyC.iterate f x