Revamp all of the standard array API
This commit is contained in:
parent
ccb689af42
commit
a0068469c5
10 changed files with 655 additions and 364 deletions
|
|
@ -1,5 +1,6 @@
|
|||
module Data.NumIdr.PrimArray.Delayed
|
||||
|
||||
import Data.List
|
||||
import Data.Vect
|
||||
import Data.NP
|
||||
import Data.NumIdr.Array.Rep
|
||||
|
|
@ -18,6 +19,20 @@ constant s x _ = x
|
|||
|
||||
|
||||
export
|
||||
checkRange : (s : Vect rk Nat) -> Vect rk Nat -> Maybe (Coords s)
|
||||
checkRange [] [] = Just []
|
||||
checkRange (d :: s) (i :: is) = (::) <$> natToFin i d <*> checkRange s is
|
||||
indexRange : {s : _} -> (rs : CoordsRange s) -> PrimArrayDelayed s a -> PrimArrayDelayed (newShape rs) a
|
||||
indexRange [] v = v
|
||||
indexRange (r :: rs) v with (cRangeToList r)
|
||||
_ | Left i = indexRange rs (\is' => v (believe_me i :: is'))
|
||||
_ | Right is = \(i::is') => indexRange rs (\is'' => v (believe_me (Vect.index i (fromList is)) :: is'')) is'
|
||||
|
||||
export
|
||||
indexSetRange : {s : _} -> (rs : CoordsRange s) -> PrimArrayDelayed (newShape rs) a
|
||||
-> PrimArrayDelayed s a -> PrimArrayDelayed s a
|
||||
indexSetRange {s=[]} [] rv _ = rv
|
||||
indexSetRange {s=_::_} (r :: rs) rv v with (cRangeToList r)
|
||||
_ | Left i = \(i'::is) => if i == finToNat i'
|
||||
then indexSetRange rs rv (v . (i'::)) is
|
||||
else v (i'::is)
|
||||
_ | Right is = \(i'::is') => case findIndex (== finToNat i') is of
|
||||
Just x => indexSetRange rs (rv . (x::)) (v . (i'::)) is'
|
||||
Nothing => v (i'::is')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue