0 | module Data.AssocList.Indexed
2 | import Data.Linear.List
4 | import Data.Array.Mutable
13 | weakenp : (Fin n, t) -> (Fin (S n), t)
14 | weakenp (x,v) = (weaken x, v)
16 | weakenpN : (0 m : Nat) -> (Fin n, t) -> (Fin (n + m), t)
17 | weakenpN m (x,v) = (weakenN m x, v)
23 | 0 Rep : Nat -> Type -> Type
24 | Rep n t = List (Fin n, t)
26 | heqRep : Eq e => Rep k e -> Rep m e -> Bool
28 | heqRep ((n1,e1) :: xs) ((n2,e2) :: ys) =
29 | case finToNat n1 == finToNat n2 && e1 == e2 of
30 | True => heqRep xs ys
34 | insertRep : Fin n -> e -> Rep n e -> Rep n e
35 | insertRep k el [] = [(k,el)]
36 | insertRep k el (x :: xs) = case compare k (fst x) of
37 | LT => (k,el) :: x :: xs
39 | GT => x :: insertRep k el xs
41 | insertWithRep : (e -> e -> e) -> Fin n -> e -> Rep n e -> Rep n e
42 | insertWithRep f k el [] = [(k,el)]
43 | insertWithRep f k el (x :: xs) = case compare k (fst x) of
44 | LT => (k,el) :: x :: xs
45 | EQ => (k,f el (snd x)) :: xs
46 | GT => x :: insertWithRep f k el xs
48 | lookupRep : Fin n -> Rep n e -> Maybe e
49 | lookupRep x [] = Nothing
50 | lookupRep x (y :: xs) = case compare x (fst y) of
51 | GT => lookupRep x xs
55 | unionRep : Rep k e -> Rep k e -> Rep k e
58 | unionRep l@(x::xs) r@(y::ys) = case compare (fst x) (fst y) of
59 | LT => x :: unionRep xs r
60 | EQ => x :: unionRep xs ys
61 | GT => y :: unionRep l ys
63 | unionMapRep : (e -> e -> b) -> (e -> b) -> Rep k e -> Rep k e -> Rep k b
64 | unionMapRep f g [] ys = map (map g) ys
65 | unionMapRep f g xs [] = map (map g) xs
66 | unionMapRep f g l@((k1,l1)::xs) r@((k2,l2)::ys) = case compare k1 k2 of
67 | LT => (k1, g l1) :: unionMapRep f g xs r
68 | EQ => (k1, f l1 l2) :: unionMapRep f g xs ys
69 | GT => (k2, g l2) :: unionMapRep f g l ys
71 | intersectWithRep : (e -> e -> b) -> Rep k e -> Rep k e -> Rep k b
72 | intersectWithRep f [] ys = []
73 | intersectWithRep f xs [] = []
74 | intersectWithRep f l@((k1,l1)::xs) r@((k2,l2)::ys) = case compare k1 k2 of
75 | LT => intersectWithRep f xs r
76 | EQ => (k1, f l1 l2) :: intersectWithRep f xs ys
77 | GT => intersectWithRep f l ys
79 | weakenRep : Rep k e -> Rep (S k) e
81 | weakenRep (x :: xs) = weakenp x :: weakenRep xs
83 | weakenRepN : (0 m : Nat) -> Rep k e -> Rep (k + m) e
84 | weakenRepN m [] = []
85 | weakenRepN m (x :: xs) = weakenpN m x :: weakenRepN m xs
92 | record AssocList (k : Nat) (e : Type) where
101 | Functor (AssocList k) where
102 | map f (AL ps) = AL $
map (map f) ps
105 | Foldable (AssocList k) where
106 | foldr c n (AL r) = foldr (c . snd) n r
107 | foldl c n (AL r) = foldl (\x => c x . snd) n r
108 | null (AL r) = null r
109 | foldMap f (AL r) = foldMap (f . snd) r
110 | toList (AL r) = map snd r
113 | Traversable (AssocList k) where
114 | traverse f (AL r) = AL <$> traverse (\(n,l) => (n,) <$> f l) r
117 | Eq e => Eq (AssocList k e) where
118 | AL r1 == AL r2 = heqRep r1 r2
121 | Show e => Show (AssocList k e) where
122 | showPrec p (AL r) =
123 | showCon p "fromList" $
showArg (map (\(n,l) => (finToNat n, l)) r)
126 | weakenAL : AssocList k e -> AssocList (S k) e
127 | weakenAL (AL r) = AL $
weakenRep r
130 | weakenALN : (0 m : Nat) -> AssocList k e -> AssocList (k + m) e
131 | weakenALN m (AL g) = AL $
weakenRepN m g
138 | empty : AssocList k e
142 | singleton : Fin k -> e -> AssocList k e
143 | singleton n v = AL [(n,v)]
146 | pairs : AssocList k e -> List (Fin k, e)
150 | mapKV : (Fin k -> e -> b) -> AssocList k e -> AssocList k b
151 | mapKV f (AL r) = AL $
map (\(x,v) => (x, f x v)) r
154 | foldlKV : (Fin k -> acc -> e -> acc) -> acc -> AssocList k e -> acc
155 | foldlKV f ini (AL r) = foldl (\v,(x,l) => f x v l) ini r
159 | {auto _ : Applicative f}
160 | -> ((Fin k,e) -> f b)
162 | -> f (AssocList k b)
163 | traverseKV f (AL r) = AL <$> traverse (\(n,l) => (n,) <$> f (n,l)) r
167 | lookup : Fin k -> AssocList k e -> Maybe e
168 | lookup k (AL r) = lookupRep k r
172 | hasKey : AssocList k e -> Fin k -> Bool
173 | hasKey l k = isJust $
lookup k l
176 | nonEmpty : AssocList k e -> Bool
177 | nonEmpty (AL []) = False
181 | isEmpty : AssocList k e -> Bool
182 | isEmpty (AL []) = True
187 | keys : AssocList k e -> List (Fin k)
188 | keys = map fst . ps
192 | values : AssocList k e -> List e
193 | values = map snd . ps
196 | length : AssocList k e -> Nat
197 | length = length . ps
204 | insert : Fin k -> e -> AssocList k e -> AssocList k e
205 | insert key lbl (AL r) = AL $
insertRep key lbl r
216 | insertWith f x v (AL r) = AL $
insertWithRep f x v r
219 | fromList : List (Fin k,e) -> AssocList k e
220 | fromList = foldl (\al,(k,v) => insert k v al) empty
226 | delete : Fin k -> AssocList k e -> AssocList k e
227 | delete x (AL r) = AL $
filter ((/= x) . fst) r
232 | mapMaybe : (e -> Maybe b) -> AssocList k e -> AssocList k b
233 | mapMaybe f (AL r) = AL $
mapMaybe (\(x,l) => (x,) <$> f l) r
238 | mapMaybeK : (Fin k -> e -> Maybe b) -> AssocList k e -> AssocList k b
239 | mapMaybeK f (AL r) = AL $
mapMaybe (\(x,l) => (x,) <$> f x l) r
243 | update : Fin k -> (e -> e) -> AssocList k e -> AssocList k e
244 | update k f (AL r) =
245 | AL $
map (\(x,l) => if k == x then (x, f l) else (x,l)) r
250 | updateA : Applicative f => Fin k -> (e -> f e) -> AssocList k e -> f (AssocList k e)
251 | updateA k g (AL r) =
252 | AL <$> traverse (\(x,l) => if k == x then (x,) <$> g l else pure (x,l)) r
260 | union : AssocList k e -> AssocList k e -> AssocList k e
261 | union (AL r1) (AL r2) = AL $
unionRep r1 r2
273 | unionMap f g (AL r1) (AL r2) = AL $
unionMapRep f g r1 r2
279 | unionWith : (e -> e -> e) -> AssocList k e -> AssocList k e -> AssocList k e
280 | unionWith f = unionMap f id
286 | intersectWith : (e -> e -> b) -> AssocList k e -> AssocList k e -> AssocList k b
287 | intersectWith f (AL r1) (AL r2) = AL $
intersectWithRep f r1 r2
293 | intersect : AssocList k e -> AssocList k e -> AssocList k e
294 | intersect = intersectWith const
298 | filterLin : (Fin k -> F1 s Bool) -> AssocList k e -> F1 s (AssocList k e)
299 | filterLin f (AL ps) t1 =
300 | let ps2 # t2 := filter1 (\(x,_) => f x) ps t1
306 | minBy : Ord b => (a -> b) -> AssocList k a -> Maybe (Fin k, a)
307 | minBy _ (AL []) = Nothing
308 | minBy f (AL $
p :: ps) = Just $
go p (f $
snd p) ps
310 | go : (Fin k, a) -> b -> List (Fin k, a) -> (Fin k, a)
313 | let v2 := f (snd h)
314 | in if v2 < v then go h v2 t else go p v t