#lang typed/scheme

(define: x : (Pair (Pair (Pair (Pair Integer String)
                               (Pair True Null))
                         (Pair (Pair False Char)
                               (Pair String Null)))
                   (Pair (Pair (Pair String Integer)
                               (Pair Float Null))
                         (Pair (Pair (Vectorof Float) True)
                               (Pair (Listof Float) False))))
  '((((1 . "1") . (#t))
     . ((#f . #\f) . ("2")))
    . ((("3" . 4) . (1.0))
       . ((#(2.0 3.0 -4.0) . #t)
          . ((2.0 3.0 4.0) . #f)))))


(ann (caar x)   (Pair (Pair Integer String) (Pair True Null)))
(ann (caaar x)  (Pair Integer String))
(ann (caaaar x) Integer)
(ann (cdaaar x) String)
(ann (cdaar x)  (Pair True Null))
(ann (cadaar x) True)
(ann (cddaar x) Null)

(ann (cdar x)   (Pair (Pair False Char) (Pair String Null)))
(ann (cadar x)  (Pair False Char))
(ann (caadar x) False)
(ann (cdadar x) Char)
(ann (cddar x)  (Pair String Null))
(ann (caddar x) String)
(ann (cdddar x) Null)

(ann (cadr x)   (Pair (Pair String Integer) (Pair Float Null)))
(ann (caadr x)  (Pair String Integer))
(ann (caaadr x) String)
(ann (cdaadr x) Integer)
(ann (cdadr x)  (Pair Float Null))
(ann (cadadr x) Float)
(ann (cddadr x) Null)

(ann (cddr x)   (Pair (Pair (Vectorof Float) True) (Pair (Listof Float) False)))
(ann (caddr x)  (Pair (Vectorof Float) True))
(ann (caaddr x) (Vectorof Float))
(ann (cdaddr x) True)
(ann (cdddr x)  (Pair (Listof Float) False))
(ann (cadddr x) (Listof Float))
(ann (cddddr x) False)
