0 | module Data.Linear.Array
10 | interface Array arr where
11 | read : (1 _ : arr t) -> Int -> Maybe t
12 | size : (1 _ : arr t) -> Int
16 | interface Array arr => MArray arr where
17 | newArray : (size : Int) -> (1 _ : (1 _ : arr t) -> a) -> a
19 | write : (1 _ : arr t) -> Int -> t -> Res Bool (const (arr t))
21 | mread : (1 _ : arr t) -> Int -> Res (Maybe t) (const (arr t))
22 | msize : (1 _ : arr t) -> Res Int (const (arr t))
25 | data IArray : Type -> Type where
26 | MkIArray : IOArray t -> IArray t
29 | data LinArray : Type -> Type where
30 | MkLinArray : IOArray t -> LinArray t
34 | toIArray : (1 _ : LinArray t) -> (IArray t -> a) -> a
35 | toIArray (MkLinArray arr) k = k (MkIArray arr)
38 | Array LinArray where
39 | read (MkLinArray a) i = unsafePerformIO (readArray a i)
40 | size (MkLinArray a) = max a
43 | MArray LinArray where
44 | newArray size k = k (MkLinArray (unsafePerformIO (newArray size)))
46 | write (MkLinArray a) i el
47 | = unsafePerformIO (do ok <- writeArray a i el
48 | pure (ok # MkLinArray a))
49 | msize (MkLinArray a) = max a # MkLinArray a
50 | mread (MkLinArray a) i
51 | = unsafePerformIO (readArray a i) # MkLinArray a
55 | read (MkIArray a) i = unsafePerformIO (readArray a i)
56 | size (MkIArray a) = max a
59 | copyArray : MArray arr => (newsize : Int) -> (1 _ : arr t) ->
60 | LPair (arr t) (arr t)
62 | = let size # a = msize a in
64 | copyContent (min (newsize - 1) (size - 1)) a
66 | copyContent : Int -> (1 _ : arr t) -> (1 _ : arr t) -> LPair (arr t) (arr t)
67 | copyContent pos a a'
70 | else let val # a = mread a pos
73 | Just v => let (ok # a') = write a' pos v in
75 | copyContent (pos - 1) a a'