-- {-# OPTIONS -v term:30 #-}
{-# OPTIONS --guardedness #-}
module ColistMutual where

mutual

  data CoList (A : Set) : Set where
    []  : CoList A
    _∷_ : (x : A)(xs : ∞CoList A) → CoList A

  record ∞CoList (A : Set) : Set where
    coinductive
    field out : CoList A

open ∞CoList

mutual

  repeat : {A : Set}(a : A) → CoList A
  repeat a = a ∷ ∞repeat a

  ∞repeat : {A : Set}(a : A) → ∞CoList A
  out (∞repeat a) = repeat a

-- example by Thorsten and Nisse, PAR 2010

data Tree : Set where
  node : CoList Tree → Tree

mutual

  bad : Tree
  bad = node (node [] ∷ bads)

  bads : ∞CoList Tree
  out bads = bad ∷ bads
  -- should not termination check

CRASH -- TODO fix termination checker

{-
data Bool : Set where
  true false : Bool

mutual

  shape : Tree → Bool
  shape (node []) = false
  shape (node (_ ∷ l)) = shapes (out l)

  shapes : CoList Tree → Bool
  shapes [] = false
  shapes (t ∷ _) = shape t

-- shape/shapes may not termination check
-}
