------------------------------------------------------------------------
-- The Agda standard library
--
-- M-types (the dual of W-types)
------------------------------------------------------------------------
module Data.M where
open import Level
open import Coinduction
-- The family of M-types.
data M {a b} (A : Set a) (B : A → Set b) : Set (a ⊔ b) where
inf : (x : A) (f : B x → ∞ (M A B)) → M A B
-- Projections.
head : ∀ {a b} {A : Set a} {B : A → Set b} →
M A B → A
head (inf x f) = x
tail : ∀ {a b} {A : Set a} {B : A → Set b} →
(x : M A B) → B (head x) → M A B
tail (inf x f) b = ♭ (f b)