packages feed

grow-vector-0.1.1.0: src/Data/Vector/Grow/Unboxed.spec

module spec Data.Vector.Grow.Unboxed where

import Data.Vector

measure vlen    :: forall a. (U.Vector a) -> Int

invariant       {v: U.Vector a | 0 <= vlen v }

(U.!)           :: forall a. x:(U.Vector a) -> vec:{v:Nat | v < vlen x } -> a

U.unsafeIndex :: forall a. x:(U.Vector a) -> vec:{v:Nat | v < vlen x } -> a

U.fromList  :: forall a. x:[a] -> {v: U.Vector a  | vlen v = len x }

U.length    :: forall a. x:(U.Vector a) -> {v : Nat | v = vlen x }

U.replicate :: n:Nat -> a -> {v:U.Vector a | vlen v = n}

U.imap :: (Nat -> a -> b) -> x:(U.Vector a) -> {y:U.Vector b | vlen y = vlen x }

U.map :: (a -> b) -> x:(U.Vector a) -> {y:U.Vector b | vlen y = vlen x }

U.head :: forall a. {xs: U.Vector a | vlen xs > 0} -> a


measure gvlen :: GrowVector s a -> Int
measure gvcap :: GrowVector s a -> Int

invariant {v: GrowVector s a | 0 <= gvlen v }
invariant {v: GrowVector s a | 0 <= gvcap v }
invariant {v: GrowVector s a | gvlen v <= gvcap v }

type GrowVectorN s a N = {v:GrowVector s a | gvlen v == N}
type GrowVectorC s a C = {v:GrowVector s a | gvcap v == C}
type GrowVectorNC s a N C = {v:GrowVector s a | gvlen v == N && gvcap v == C}

assume capacity :: (Unbox a, PrimMonad m) => x : GrowVector (PrimState m) a -> m {v:Int | v = gvcap x}

assume length :: (Unbox a, PrimMonad m) => x : GrowVector (PrimState m) a -> m {v:Int | v = gvlen x}

null :: (Unbox a, PrimMonad m) => x : GrowVector (PrimState m) a -> m { v:Bool | v <=> gvlen x = 0}

assume newSized :: (Unbox a, PrimMonad m) => l:Nat -> {c:Nat | c >= l} -> m { v:(GrowVector (PrimState m) a) | l = gvlen v && c = gvcap v }

assume slice :: (Unbox a, PrimMonad m)
  => i:Nat
  -> n:Nat
  -> {x:(GrowVector (PrimState m) a) | i < gvlen x && i + n <= gvlen x }
  -> m {y:(GrowVector (PrimState m) a) | gvlen y = n && gvcap y = n }

assume thaw :: (Unbox a, PrimMonad m)
  => v : U.Vector a
  -> m {gv:(GrowVector (PrimState m) a) | vlen v == gvlen gv && gvcap gv == 0 }

freeze :: (Unbox a, PrimMonad m)
  => gv : GrowVector (PrimState m) a
  -> m {v:(U.Vector a) | vlen v == gvlen gv }

assume ensure :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> c : Nat
  -> m {r:() | gvcap x = c}

assume ensureAppend :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> n : Nat
  -> m {r:() | gvcap x >= gvlen x + n }

read :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> {i:Nat | i < gvlen x}
  -> m a

unsafeRead :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> {i:Nat | i < gvlen x}
  -> m a

write :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> {i:Nat | i < gvlen x}
  -> a
  -> m ()

unsafeWrite :: (Unbox a, PrimMonad m)
  => x : GrowVector (PrimState m) a
  -> {i:Nat | i < gvlen x}
  -> a
  -> m ()