Martin Escardo and Paulo Oliva 2011

\begin{code}

{-# OPTIONS --safe --without-K #-}

module InfinitePigeon.DataStructures where

\end{code}

Some definitions of standard things
(sorry for not using libraries).

\begin{code}

open import InfinitePigeon.Addition
open import InfinitePigeon.Finite
open import InfinitePigeon.LogicalFacts
open import InfinitePigeon.Naturals

data List (X : Set) : Set where
 [] : List X
 _::_  : X  List X  List X

infixr 30 _::_

\end{code}

Transforms a finite list given as a map to an enumerated finite
list:

\begin{code}

list : {m : } {X : Set}  (smaller m  X)  List X
list {0} s = []
list {succ m} s = s fzero :: list {m} (s  fsucc)

\end{code}

Binary products:

\begin{code}

data _×_ (X Y : Set) : Set where
 _,_ : X  Y  X × Y

infixr 20 _,_

\end{code}

The cons operation for the Cantor space:

\begin{code}

open import InfinitePigeon.Cantor
open import InfinitePigeon.Two

_^_ :   ₂ℕ  ₂ℕ
(O ^ α) O = 
(O ^ α) (succ i) = α i
(succ n ^ α) O = 
(succ n ^ α) (succ i) = α i

infixr 30 _^_

\end{code}

Take a finite initial sublist of an infinite sequence.

\begin{code}

take : (m : ) {X : Set}  (  X)  List X
take 0 α = []
take (succ m) α = α 0 :: take m (α  succ)

\end{code}

Index a finite sequence:

\begin{code}

_!_ : {m : }  (smaller(m + 1)  )    
_!_ {m} s n = s(fmin m n)

\end{code}