
#lang racket/load


(module test typed/racket


 (provide a:list-helper)

 (define-type (Append-List+ elem) (U (a:singleton elem) (a:join elem)))

 (define-struct: (elem) a:join
   ((left : (Append-List+ elem)) (right : (Append-List+ elem)))
   #:transparent)

 (define-struct: (elem) a:singleton
   ((elem : elem)) #:transparent)

 (: a:list-helper (All (elem) ((Pair elem (Listof elem)) -> (Append-List+ elem))))
 (define (a:list-helper elems)
   (cond
     ((empty? (cdr elems)) (make-a:singleton (car elems)))
     (else (make-a:join (make-a:singleton (car elems))
                        (a:list-helper (cdr elems))))))
 )

(module test2 racket
 (require 'test)
 (a:list-helper (list 1 2)))

(require 'test2)