0 | module Text.ILex.Internal.Types
2 | import public Text.ILex.RExp
3 | import public Data.Linear.Ref1
5 | import Data.Array.Core
6 | import Data.Array.Index
7 | import Data.Array.Mutable
8 | import Data.Linear.Traverse1
10 | import Data.SortedMap
11 | import Derive.Prelude
15 | %language ElabReflection
27 | record NatMap1 (s,a : Type) where
29 | ref : Ref s (
n ** MArray s n (Maybe a))
32 | empty : {default 256 size : Nat} -> (0 p : IsSucc size) => F1 s (NatMap1 s a)
34 | arr <- marray1 size Nothing
35 | ref <- ref1 (
size ** arr)
39 | lookup1 : Nat -> NatMap1 s a -> F1 s (Maybe a)
41 | read1 m.ref >>= \(
sz ** vs)
=>
42 | case tryNatToFin n of
43 | Just x => Core.get vs x
44 | Nothing => pure Nothing
47 | lookupDflt1 : Nat -> Lazy a -> NatMap1 s a -> F1 s a
48 | lookupDflt1 n dflt m =
49 | read1 m.ref >>= \(
sz ** vs)
=>
50 | case tryNatToFin n of
51 | Just x => Core.get vs x >>= pure . fromMaybe dflt
52 | Nothing => pure dflt
55 | delete1 : Nat -> NatMap1 s a -> F1' s
57 | read1 m.ref >>= \(
sz ** vs)
=>
58 | case tryNatToFin n of
59 | Just x => Core.set vs x Nothing
63 | insert1 : Nat -> a -> NatMap1 s a -> F1' s
64 | insert1 n v m = read1 m.ref >>= \(_ ** vs) => go vs
66 | go : {sz : _} -> MArray s sz (Maybe a) -> F1' s
68 | case tryNatToFin n of
70 | let _ # t := Core.set vs x (Just v) t
71 | in write1 m.ref (
_ ** vs)
t
73 | let vs2 # t := mgrow vs sz Nothing t
74 | in go (assert_smaller vs vs2) t
77 | fromList1 : List (Nat,a) -> F1 s (NatMap1 s a)
78 | fromList1 ps = T1.do
80 | traverse1_ (\(k,v) => insert1 k v m) ps
84 | pairs1 : NatMap1 s a -> F1 s (List (Nat,a))
85 | pairs1 m = read1 m.ref >>= \(
sz ** vs)
=> go vs [<] sz
88 | MArray s sz (Maybe a)
91 | -> {auto 0 lte : LTE n sz}
92 | -> F1 s (List (Nat,a))
93 | go vs sv 0 t = (sv <>> []) # t
95 | case getNat vs k t of
96 | Just v # t => go vs (sv:<(k,v)) k t
97 | Nothing # t => go vs sv k t
100 | keys1 : NatMap1 s a -> F1 s (List Nat)
101 | keys1 m = map fst <$> pairs1 m
104 | values1 : NatMap1 s a -> F1 s (List a)
105 | values1 m = map snd <$> pairs1 m
111 | parameters {sz : Nat}
112 | (children : a -> List Nat)
113 | (visited : MArray s sz Bool)
114 | (is,os : MArray s sz (Maybe a))
117 | visit : List Nat -> F1' s
118 | visit [] t = () # t
120 | case tryNatToFin x of
121 | Nothing => visit xs t
122 | Just k => case Core.get visited k t of
123 | True # t => visit xs t
125 | let _ # t := Core.set visited k True t
126 | in case Core.get is k t of
127 | Nothing # t => visit xs t
129 | let _ # t := Core.set os k (Just node) t
130 | in visit (children node ++ xs) t
133 | connectedComponent : (a -> List Nat) -> Nat -> NatMap1 s a -> F1' s
134 | connectedComponent c n m =
135 | read1 m.ref >>= \(
sz ** is)
=> T1.do
136 | vis <- marray1 sz False
137 | os <- marray1 sz Nothing
138 | assert_total $
visit c vis is os [n]
139 | write1 m.ref (
sz ** os)
149 | union_ : SnocList Nat -> NSet -> NSet -> NSet
150 | union_ sx l@(x::xs) r@(y::ys) =
151 | case compare x y of
152 | LT => union_ (sx:<x) xs r
153 | GT => union_ (sx:<y) l ys
154 | EQ => union_ (sx:<x) xs ys
155 | union_ sx [] ys = sx <>> ys
156 | union_ sx xs [] = sx <>> xs
159 | sunion : NSet -> NSet -> NSet
160 | sunion = union_ [<]
177 | transitions : Edge -> List (Bits8,Nat)
178 | transitions (E rule tgt) =
179 | let l := lowerBound rule
180 | u := upperBound rule
181 | in case compare l u of
182 | LT => (,tgt) <$> [l..u]
186 | %runElab derive "Edge" [Show,Eq]
200 | %runElab deriveIndexed "ENode" [Show]
203 | 0 EGraph : Type -> Type
204 | EGraph s = NatMap1 s ENode
217 | %runElab derive "NEdge" [Show,Eq]
222 | NEdges = List NEdge
231 | %runElab deriveIndexed "NNode" [Show]
234 | nchildren : NNode -> List Nat
235 | nchildren (NN _ _ out) = out >>= tgts
238 | 0 NGraph : Type -> Type
239 | NGraph s = NatMap1 s NNode
248 | %runElab deriveIndexed "Node" [Show]
251 | children : Node -> List Nat
252 | children n = tgt <$> n.out
255 | 0 Graph : Type -> Type
256 | Graph s = NatMap1 s Node
263 | record DFAState (s,a : Type) where
264 | [noHints, search s]
267 | sets : Ref s (SortedMap NSet Nat)
274 | init : F1 s (DFAState s a)
277 | ss <- ref1 SortedMap.empty
282 | pure (ST as ss eg ng g cr)
284 | parameters {auto st : DFAState s a}
290 | write1 st.cur (S n)
294 | addSet : NSet -> F1 s Nat
297 | mod1 st.sets (insert set n)
301 | lookupSet : NSet -> F1 s (Maybe Nat)
302 | lookupSet set = read1 st.sets >>= pure . lookup set
305 | insertENode : Nat -> ENode -> F1 s Nat
306 | insertENode k n = insert1 k n st.egraph >> pure k
309 | insertTerminal : (Nat,t,a) -> F1' s
310 | insertTerminal (k,_,c) = T1.do
311 | _ <- insertENode k (EN [k] [] [])
312 | insert1 k c st.accs
315 | createENode : ENode -> F1 s Nat
316 | createENode n = inc >>= (`insertENode` n)
319 | lookupENode : Nat -> F1 s (Maybe ENode)
320 | lookupENode n = lookup1 n st.egraph
323 | getENode : Nat -> F1 s ENode
324 | getENode n = lookupDflt1 n (EN [] [] []) st.egraph
327 | insertNNode : Nat -> NNode -> F1' s
328 | insertNNode k n = insert1 k n st.ngraph
331 | lookupNNode : Nat -> F1 s (Maybe NNode)
332 | lookupNNode n = lookup1 n st.ngraph
335 | getNNode : Nat -> F1 s NNode
336 | getNNode n = lookupDflt1 n (NN n [] []) st.ngraph
339 | insertNode : Nat -> Node -> F1' s
340 | insertNode k n = insert1 k n st.graph
343 | lookupNode : Nat -> F1 s (Maybe Node)
344 | lookupNode n = lookup1 n st.graph
347 | getNode : Nat -> F1 s Node
348 | getNode n = lookupDflt1 n (N n [] []) st.graph
351 | evalST : (forall s . DFAState s a => F1 s b) -> b
352 | evalST f = run1 $
init >>= \st => f @{st}
355 | normalizeGraph : F1' s
356 | normalizeGraph = T1.do
357 | ps <- pairs1 st.graph
358 | mp <- fromList1 (map swap $
zipWithIndex $
map fst ps)
359 | ps2 <- traverse1 (translate mp) ps
360 | rs <- fromList1 ps2
361 | arr <- read1 rs.ref
362 | write1 st.graph.ref arr
365 | translate : NatMap1 s Nat -> (Nat,Node) -> F1 s (Nat,Node)
366 | translate m (x, N pos acc out) = T1.do
367 | x2 <- lookupDflt1 x 0 m
368 | out2 <- traverse1 (\(E r t) => E r <$> lookupDflt1 t 0 m) out
369 | pure (x2, N x2 acc out2)
376 | record Machine a b where
378 | terminals : SortedMap Nat a
384 | machine : (forall s . DFAState s a => F1 s b) -> Machine a b
389 | ps <- pairs1 st.accs
390 | pure (M (SortedMap.fromList ps) res)