Require Class/basicCurve

basicCurve Subclass basicCurveFromCurve {
  Var P Q function f-setup "param {[basicCurve get param]}"
  ClassVar {linkable-types basicCurve}
  ClassVar cfunction {frame 0}
  ClassVar {domain {Inherit}}

  Method SetValues {} {
    Vars function f-setup param frame cfunction
    set object [Self Reference Object]
    set point [Self Inherit point]
    set P [var P]

    if {$frame && [$object getDimension] != 3} \
      {Error "Frame-based actions only work when '$object' is in 3 dimensions"}

    set f-setup [list "uplevel {upvar \#0 $P $P}"]

    set function [list \
      "set $P \[$object F \${$param}\]" \
      {foreach _i [array names _X] {set _X($_i) 0}} \
      ${cfunction} \
      "set _P \[+ \${$P} \[$point\]\]" \
      {foreach _i [array names _X] {set _X($_i) [lindex $_P $_i]}} \
    ]
    if {$frame} {
      set Q [var Q]; lappend f-setup "uplevel {upvar \#0 $Q $Q}"
      set function [lreplace $function 3 3 \
        "set $Q \[$point\]" \
        "set _P \[+ \${$P} \[* \[Transpose\
           \[join \[$object FFrame \${$param}\] { }\]\] \${$Q}\]\]"]
    }

    set function [join $function \n]
    set f-setup [join ${f-setup} \n]
  }

  Method GetDomainList {D} {
    set object [Self Reference Object]
    uplevel [list basicCurve InheritCurveDomainList $D $object]
  }

  Method Inherit {var} {Self InheritReference $var}
}
