#lang racket
(provide intersectiontimes
intersectionpoint
rotate
shift
scale
xscale
yscale
zscale
transform
cutbefore
cutafter)
(require "mpost-variable.rkt")
(require "mpost-utils.rkt")
(require "mpost-type-funs.rkt")
(define-syntax-rule (def-op name type)
(def-exp (name a b)
type
(to-string (list a 'name b))))
(def-op intersectiontimes ((type-> 'path 'path 'pair)))
(def-op intersectionpoint ((type-> 'path 'path 'pair)))
(define (transform-op-type x)
(type-or (type-> x 'path 'path)
(type-> x 'pair 'pair)
(type-> x 'transform 'transform)
(type-> x 'picture 'picture)
(type-> x 'pen 'pen)))
(define-syntax-rule (def-T-op name op type)
(def-exp (name a b) type (to-string (list b 'op a))))
(def-T-op rotate rotated ((transform-op-type 'numeric)))
(def-T-op shift shifted ((transform-op-type 'pair)))
(def-T-op scale scaled ((transform-op-type 'numeric)))
(def-T-op xscale xscaled ((transform-op-type 'numeric)))
(def-T-op yscale yscaled ((transform-op-type 'numeric)))
(def-T-op zscale zscaled ((transform-op-type 'pair)))
(def-T-op transform transformed ((transform-op-type 'transform)))
(def-op cutbefore ((type-> 'path 'path 'path)))
(def-op cutafter ((type-> 'path 'path 'path)))