0 | module Text.ILex.State.Streaming
2 | import Data.Linear.Ref1
4 | import Text.ByteBounds
5 | import Text.ILex.Interfaces
6 | import Text.ILex.Parser
7 | import Text.ILex.State.Derive
8 | import Text.ILex.Util
9 | import Text.ParseError
12 | %language ElabReflection
24 | record State (e,s,a : Type) (r : Bits32) (q : Type) where
30 | cur_ : IBuffer bufSize_
33 | from_ : Ref q (LTENat bufSize_)
34 | till_ : Ref q (LTENat bufSize_)
35 | positions_ : Ref q (SnocList BytePos)
39 | state_ : Ref q (Index r)
40 | values_ : Ref q (SnocList a)
43 | strings_ : Ref q (SnocList String)
46 | error_ : Ref q (Maybe $
BBErr e)
52 | %runElab derive "State" [FullState]
60 | -> F1 q (State e s a r q)
61 | init c v n buf = T1.do
62 | rf <- ref1 (first n)
63 | rt <- ref1 (first n)
71 | pure (SS n empty buf 0 0 rf rt ps sk st ds ss er c dp)
74 | pushValue : State e s a r q => a -> s -> Index r -> F1 q (Index r)
75 | pushValue @{st} d sk x t =
76 | let _ # t := push1 st.values_ d t
77 | in writeAs st.stack_ sk x t
80 | values : State e s a r q -> F1 q (Either x $
List a)
82 | let sd # t := replace1 st.values_ [<] t
83 | in Right (sd <>> []) # t
86 | valuesChunk : State e s a r q -> F1 q (Maybe $
List a)
88 | let sd # t := replace1 st.values_ [<] t