{-# OPTIONS --cubical --guardedness --postfix-projections #-} module Data.Graph where open import Prelude open import Data.List open import Data.Nat -- record Thunk (A : Type a) : Type a where -- coinductive -- constructor ⟪_⟫ -- field force : A -- open Thunk -- infixr 5 _◃_ -- record Stream (A : Type a) : Type a where -- constructor _◃_ -- coinductive -- field -- head : A -- tail : (Stream A) -- open Stream Graph : Type a → Type a Graph A = A → List A Stream : Type a → Type a Stream A = ℕ → A pure : A → Stream A pure x _ = x smap : (A → B) → Stream A → Stream B smap f xs n = f (xs n) bfs : Graph A → A → Stream (List A) bfs g r zero = r ∷ [] bfs g r (suc n) = concatMap g (bfs g r n) -- module _ {A : Type a} (g : Graph A) where -- mutual -- bfs-foldr : List A → Stream (List A) → Stream (List A) -- bfs-foldr [] qs = qs -- bfs-foldr (x ∷ xs) qs .head = x ∷ bfs-foldr xs qs .head -- bfs-foldr (x ∷ xs) qs .tail .force = bfs-foldr (g x) (bfs-foldr xs qs .tail .force) -- -- bfs-cons : A → Stream (List A) → Stream (List A) -- -- bfs-cons x (q ◃ qs) = (x ∷ q) ◃ bfs-foldr (g x) qs -- -- bfs : A → Stream (List A) -- -- bfs r = bfs-cons r (pure [])