0 | module Data.String.Iterator
2 | import Control.Monad.Identity
3 | import public Data.List.Lazy
19 | data StringIterator : String -> Type where [external]
24 | "scheme:blodwen-string-iterator-new"
25 | "RefC:stringIteratorNew"
26 | "javascript:stringIterator:new"
28 | fromString : (str : String) -> StringIterator str
33 | withString : (str : String) -> ((1 it : StringIterator str) -> a) -> a
34 | withString str f = f (fromString str)
39 | "scheme:blodwen-string-iterator-to-string"
40 | "RefC:stringIteratorToString"
41 | "javascript:stringIterator:toString"
43 | withIteratorString : (str : String)
44 | -> (1 it : StringIterator str)
45 | -> (f : (res : String) -> a)
55 | data UnconsResult : String -> Type where
56 | EOF : UnconsResult str
57 | Character : (c : Char) -> (1 it : StringIterator str) -> UnconsResult str
64 | "scheme:blodwen-string-iterator-next"
65 | "RefC:stringIteratorNext"
66 | "javascript:stringIterator:next"
68 | uncons : (str : String) -> (1 it : StringIterator str) -> UnconsResult str
71 | foldl : (accTy -> Char -> accTy) -> accTy -> String -> accTy
72 | foldl op acc str = withString str (loop acc)
74 | loop : accTy -> (1 it : StringIterator str) -> accTy
76 | case uncons str it of
78 | Character c it' => loop (acc `op` c) (assert_smaller it it')
81 | unpack : String -> LazyList Char
82 | unpack str = runIdentity $
withString str unpack'
86 | mapId : forall a, b. (a -> b) -> (1 x : Identity a) -> Identity b
87 | mapId f (Id x) = Id (f x)
89 | unpack' : (1 it : StringIterator str) -> Identity (Lazy (LazyList Char))
91 | case uncons str it of
93 | Character c it' => mapId (c ::) (unpack' $
assert_smaller it it')