4 | import public Data.Zippable
10 | data Colist : (a : Type) -> Type where
12 | (::) : a -> Inf (Colist a) -> Colist a
20 | fromList : List a -> Colist a
22 | fromList (x :: xs) = x :: fromList xs
26 | fromStream : Stream a -> Colist a
27 | fromStream (x :: xs) = x :: fromStream xs
31 | singleton : a -> Colist a
32 | singleton a = a :: Nil
36 | repeat : a -> Colist a
37 | repeat v = v :: repeat v
41 | replicate : Nat -> a -> Colist a
43 | replicate (S k) x = x :: replicate k x
47 | cycle : List a -> Colist a
49 | cycle (x :: xs) = run x xs
50 | where run : a -> List a -> Colist a
51 | run v [] = v :: run x xs
52 | run v (y :: ys) = v :: run y ys
56 | iterate : (a -> a) -> a -> Colist a
57 | iterate f a = a :: iterate f (f a)
62 | iterateMaybe : (f : a -> Maybe a) -> Maybe a -> Colist a
63 | iterateMaybe _ Nothing = Nil
64 | iterateMaybe f (Just x) = x :: iterateMaybe f (f x)
70 | unfold : (f : s -> Maybe (s,a)) -> s -> Colist a
71 | unfold f s = case f s of
72 | Just (s2,a) => a :: unfold f s2
81 | isNil : Colist a -> Bool
87 | isCons : Colist a -> Bool
93 | append : Colist a -> Colist a -> Colist a
95 | append (x :: xs) ys = x :: append xs ys
99 | lappend : List a -> Colist a -> Colist a
100 | lappend xs = append (fromList xs)
104 | appendl : Colist a -> List a -> Colist a
105 | appendl xs = append xs . fromList
109 | uncons : Colist a -> Maybe (a, Colist a)
110 | uncons [] = Nothing
111 | uncons (x :: xs) = Just (x, xs)
115 | head : Colist a -> Maybe a
117 | head (x :: _) = Just x
123 | tail : Colist a -> Maybe (Colist a)
125 | tail (_ :: xs) = Just xs
129 | take : (n : Nat) -> Colist a -> List a
131 | take (S k) [] = Nil
132 | take (S k) (x :: xs) = x :: take k xs
137 | takeUntil : (p : a -> Bool) -> Colist a -> Colist a
138 | takeUntil _ [] = Nil
139 | takeUntil p (x :: xs) = if p x then [x] else x :: takeUntil p xs
144 | takeBefore : (a -> Bool) -> Colist a -> Colist a
145 | takeBefore _ [] = Nil
146 | takeBefore p (x :: xs) = if p x then [] else x :: takeBefore p xs
151 | takeWhile : (a -> Bool) -> Colist a -> Colist a
152 | takeWhile p = takeBefore (not . p)
157 | takeWhileJust : Colist (Maybe a) -> Colist a
158 | takeWhileJust [] = []
159 | takeWhileJust (Nothing :: _) = []
160 | takeWhileJust (Just x :: xs) = x :: takeWhileJust xs
164 | drop : (n : Nat) -> Colist a -> Colist a
167 | drop (S k) (x :: xs) = drop k xs
171 | index : (n : Nat) -> Colist a -> Maybe a
172 | index _ [] = Nothing
173 | index 0 (x :: _) = Just x
174 | index (S k) (_ :: xs) = index k xs
181 | scanl : (f : a -> b -> a) -> (acc : a) -> (xs : Colist b) -> Colist a
182 | scanl _ acc Nil = [acc]
183 | scanl f acc (x :: xs) = acc :: scanl f (f acc x) xs
194 | data InBounds : (k : Nat) -> (xs : Colist a) -> Type where
196 | InFirst : {0 xs : Inf (Colist a)} -> InBounds Z (x :: xs)
198 | InLater : {0 xs : Inf (Colist a)} -> InBounds k xs -> InBounds (S k) (x :: xs)
201 | Uninhabited (Data.Colist.InBounds k []) where
202 | uninhabited InFirst
impossible
203 | uninhabited (InLater
_) impossible
206 | Uninhabited (Colist.InBounds k xs) => Uninhabited (Colist.InBounds (S k) (x::xs)) where
207 | uninhabited (InLater y) = uninhabited y
211 | inBounds : (k : Nat) -> (xs : Colist a) -> Dec (InBounds k xs)
212 | inBounds k [] = No uninhabited
213 | inBounds Z (x::xs) = Yes InFirst
214 | inBounds (S k) (x::xs) = case inBounds k xs of
215 | Yes p => Yes $
InLater p
216 | No up => No $
\(InLater p) => up p
222 | index' : (k : Nat) -> (xs : Colist a) -> {auto 0 ok : InBounds k xs} -> a
223 | index' Z (x::_) {ok = InFirst} = x
224 | index' (S k) (_::xs) {ok = InLater _} = index' k xs
231 | Semigroup (Colist a) where
235 | Monoid (Colist a) where
239 | Functor Colist where
241 | map f (x :: xs) = f x :: map f xs
244 | Applicative Colist where
249 | f :: fs <*> a :: as = f a :: (fs <*> as)
251 | public export %hint %inline
252 | ZippableColist : Zippable Colist
253 | ZippableColist = FromApplicative