packages feed

Agda-2.3.2.2: test/succeed/Rose.agda

{-# OPTIONS --sized-types #-}

module Rose where

postulate
  Size : Set
  _^   : Size -> Size
  ∞    : Size

{-# BUILTIN SIZE Size  #-}
{-# BUILTIN SIZESUC _^ #-}
{-# BUILTIN SIZEINF ∞  #-}

data List (A : Set) : {_ : Size} -> Set where
  []   : {size : Size} -> List A {size ^}
  _::_ : {size : Size} -> A -> List A {size} -> List A {size ^}

map : {A B : Set} -> (A -> B) -> 
      {size : Size} -> List A {size} -> List B {size}
map f [] = []
map f (x :: xs) = f x :: map f xs

data Rose (A : Set) : {_ : Size} -> Set where
  rose : {size : Size} -> A -> List (Rose A {size}) {∞} -> Rose A {size ^}

{-
mapRose : {A B : Set} -> (A -> B) -> 
          {size : Size} -> Rose A {size} -> Rose B {size}
mapRose {A} {B} f .{size ^} (rose {size} a l) =
   rose (f a) (map (\ r -> mapRose {A} {B} f {size} r) l)
-}

mapRose : {A B : Set} -> (A -> B) -> 
          {size : Size} -> Rose A {size} -> Rose B {size}
mapRose f (rose a l) = rose (f a) (map (mapRose f) l)