packages feed

ox-arrays-0.2.0.0: src/Data/Vector/Generic/Checked.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE ImportQualifiedPost #-}
module Data.Vector.Generic.Checked (
  fromListNChecked,
) where

import Data.Stream.Monadic qualified as Stream
import Data.Vector.Fusion.Bundle.Monadic qualified as VBM
import Data.Vector.Fusion.Bundle.Size qualified as VBS
import Data.Vector.Fusion.Util qualified as VFU
import Data.Vector.Generic qualified as VG

-- for INLINE_FUSED and INLINE_INNER
#include "vector.h"


-- These functions are copied over and lightly edited from the vector and
-- vector-stream packages, and thus inherit their BSD-3-Clause license with:
-- Copyright (c) 2008-2012, Roman Leshchinskiy
--               2020-2022, Alexey Kuleshevich
--               2020-2022, Aleksey Khudyakov
--               2020-2022, Andrew Lelechenko

fromListNChecked :: VG.Vector v a => Int -> [a] -> v a
{-# INLINE fromListNChecked #-}
fromListNChecked n = VG.unstream . bundleFromListNChecked n

bundleFromListNChecked :: Int -> [a] -> VBM.Bundle VFU.Id v a
{-# INLINE_FUSED bundleFromListNChecked #-}
bundleFromListNChecked nTop xsTop
  | nTop < 0 = error "fromListNChecked: length negative"
  | otherwise =
      VBM.fromStream (Stream.Stream step (xsTop, nTop)) (VBS.Max (VFU.delay_inline max nTop 0))
  where
    {-# INLINE_INNER step #-}
    step (xs,n) | n == 0 = case xs of
                             [] -> return Stream.Done
                             _:_ -> error "fromListNChecked: list too long"
    step (x:xs,n)        = return (Stream.Yield x (xs,n-1))
    step ([],_)          = error "fromListNChecked: list too short"