0 | module Data.Array.All
2 | import public Data.List
3 | import public Data.List.Elem
4 | import public Data.List.Quantifiers
6 | import Data.Array.Core
7 | import Data.Array.Index
9 | import Data.Linear.Token
14 | data El : List a -> List a -> Type where
16 | SEl : El as (v::bs) -> El as bs
19 | elToNat : El as bs -> Nat
21 | elToNat (SEl k) = S $
elToNat k
24 | 0 elLemma : (el : El as (v::bs)) -> LT (elToNat el) (length as)
25 | elLemma ZEl = LTESucc LTEZero
40 | record ArrAll (f : a -> Type) (as : List a) where
45 | 0 HArr : List Type -> Type
46 | HArr = ArrAll Prelude.id
49 | Index : (as : List a) -> Fin (length as) -> a
50 | Index (x :: xs) FZ = x
51 | Index (x :: xs) (FS k) = Index xs k
52 | Index [] _ impossible
55 | elemToFin : Elem a as -> Fin (length as)
56 | elemToFin {as = _::_} Here = FZ
57 | elemToFin {as = _::_} (There x) = FS $
elemToFin x
59 | len : All f xs -> Nat
61 | len (_::t) = S $
len t
64 | 0 ElemLemma : (el : Elem a as) -> a === Index as (elemToFin el)
65 | ElemLemma Here = Refl
66 | ElemLemma (There x) = ElemLemma x
70 | at : ArrAll f as -> (x : Fin (length as)) -> f (Index as x)
71 | at (AA ad) m = believe_me $
prim__arrayGet ad (cast $
finToNat m)
77 | elem : ArrAll f as -> (0 a : _) -> (el : Elem a as) => f a
78 | elem arr a = rewrite ElemLemma el in at arr (elemToFin el)
86 | data MArrAll : (s : Type) -> (f : a -> Type) -> (as : List a) -> Type where
87 | MA : (arr : AnyPtr) -> MArrAll s f as
90 | 0 MHArr : Type -> List Type -> Type
91 | MHArr s = MArrAll s Prelude.id
95 | set : MArrAll s f as -> (x : Fin (length as)) -> f (Index as x) -> F1' s
96 | set (MA arr) ix v = ffi (prim__arraySet arr (cast $
finToNat ix) (believe_me v))
100 | setElem : MArrAll s f as -> f a -> (el : Elem a as) => F1' s
101 | setElem arr v = All.set arr (elemToFin el) (rewrite sym (ElemLemma el) in v)
105 | setEls : MArrAll s f as -> All f bs -> (el : El as bs) -> F1' s
106 | setEls arr [] el t = () # t
107 | setEls ma@(MA arr) (v :: vs) el t =
108 | let _ # t := ffi (prim__arraySet arr (cast $
elToNat el) (believe_me v)) t
109 | in setEls ma vs %search t
117 | get : MArrAll s f as -> (x : Fin (length as)) -> F1 s (f $
Index as x)
118 | get (MA arr) ix t = believe_me (prim__arrayGet arr (cast $
finToNat ix)) # t
121 | getElem : MArrAll s f as -> (0 a : _) -> (el : Elem a as) => F1 s (f a)
122 | getElem arr ix = rewrite ElemLemma el in get arr (elemToFin el)
125 | setElems : All f as -> All (`Elem` bs) as => MArrAll s f bs -> F1' s
126 | setElems [] _ t = () # t
127 | setElems (v::vs) @{_::_} x t = let _ # t := setElem x v t in setElems vs x t
131 | mall1 : All f as -> F1 s (MArrAll s f as)
133 | let p # t := ffi (prim__emptyArray (cast $
len vs)) t
135 | _ # t := setEls arr vs ZEl t
139 | unsafeFreeze : MArrAll s f as -> F1 s (ArrAll f as)
140 | unsafeFreeze (MA p) t = AA p # t
144 | mall : Lift1 s m => All f as -> m (MArrAll s f as)
145 | mall as = lift1 (mall1 as)
153 | all : All f as -> ArrAll f as
154 | all vs = run1 $
\t => let ma # t := mall1 vs t in unsafeFreeze ma t