#lang typed/racket/base

(struct (A) s ([f : A]) #:type-name S)

(define si : (S String) (s "foo"))
(ann (s-f si) String)

(define-struct/exec exec ()
  [(λ (e x) (add1 x)) : (Exec Real -> Real)]
  #:type-name Exec)

((ann (exec) (Intersection Exec (Real . -> . Real))) 3)

#lang typed/racket/base

(struct (A) s ([f : A]) #:type-name S)

(define si : (S String) (s "foo"))
(ann (s-f si) String)

(define-struct/exec exec ()
  [(λ (e x) (add1 x)) : (Exec Real -> Real)]
  #:type-name Exec)

((ann (exec) (Intersection Exec (Real . -> . Real))) 3)
