#lang racket/base
;; Misc support routines not (yet) provided by racket itself

(provide non-object-struct?
         struct-type-name
         struct-type-constructor-arity
         struct->struct-type)

(require (only-in racket/class object?))

;; Any -> Boolean
;; Racket objects are structures, so we reject them explicitly for
;; now, leaving them opaque to unification.
(define (non-object-struct? x)
  (and (struct? x)
       (not (object? x))))

;; struct-type -> Symbol
;; Extract just the name of the given struct-type.
(define (struct-type-name st)
  (define-values (name x2 x3 x4 x5 x6 x7 x8) (struct-type-info st))
  name)

;; StructType -> Natural
(define (struct-type-constructor-arity st)
  (define-values (x1 arity x3 x4 x5 x6 x7 x8) (struct-type-info st))
  arity)

;; Structure -> StructType
;; Errors when given any struct that isn't completely transparent/prefab.
(define (struct->struct-type p)
  (define-values (t skipped?) (struct-info p))
  (when skipped? (error 'struct->struct-type "Cannot reflect on struct instance ~v" p))
  t)

