type index = int;;

type time = int;;

type basic = N of int
           | R of float
           | Vec of vector
	   | Zero
           | Error
and vector = < size : int; nth : (index -> basic) >;;

class type vector_type = 
	object
	  method size : int
	  method nth : index -> basic
	end;;

class type value_type = 
  object
    method get : basic
    method to_int : int
    method to_float : float
    method to_float_array : float array
    method of_float_array : float array -> value_type
    method to_string : string
    method normalize : unit
    method add : value_type -> value_type
    method neg : value_type
    method sub : value_type -> value_type
    method mul : value_type -> value_type
    method recip : value_type
    method div : value_type -> value_type
    method power : value_type -> value_type
    method _and : value_type -> value_type
    method _or : value_type -> value_type
    method _xor : value_type -> value_type
    method zero : value_type
    method floor : value_type
    method ceil : value_type
    method rint : value_type
    method int : value_type
    method float : value_type
    method sin : value_type
    method asin : value_type
    method cos : value_type
    method acos : value_type
    method tan : value_type
    method atan : value_type
    method atan2 : value_type -> value_type
    method exp : value_type
    method sqrt : value_type
    method ln : value_type
    method lg : value_type
    method abs : value_type
    method fmod : value_type -> value_type
    method _mod : value_type -> value_type
    method remainder : value_type -> value_type
    method gt : value_type -> value_type
    method lt : value_type -> value_type
    method geq : value_type -> value_type
    method leq : value_type -> value_type
    method eq : value_type -> value_type
    method neq : value_type -> value_type
    method shl : value_type -> value_type
    method shr : value_type -> value_type
    method max : value_type -> value_type
    method min : value_type -> value_type
  end;;


type symbol = Add
  	    | Sub
	    | Mul
	    | Div
	    | Power
	    | Pass
	    | Stop
	    | And
	    | Or
	    | Xor
	    | Mem
	    | Delay
	    | Floor
	    | Ceil
	    | Rint
	    | Int
	    | Float
	    | Sin
	    | Asin
	    | Cos
	    | Acos
	    | Tan
	    | Atan
	    | Atan2
	    | Exp
	    | Sqrt
	    | Ln
	    | Lg
	    | Abs
	    | Fmod
	    | Mod
	    | Remainder
	    | Vectorize
	    | Vconcat
	    | Vpick
	    | Serialize
	    | Gt
	    | Lt
	    | Geq
	    | Leq
	    | Eq
	    | Neq
	    | Shl
	    | Shr
	    | Max
	    | Min
	    | Prefix
	    | Select2
	    | Select3
	    | Rdtable
	    | Rwtable
	    | Button
	    | Checkbox
	    | Vslider
	    | Hslider
	    | Vgroup
	    | Hgroup
	    | Tgroup
	    | Hbargraph
	    | Vbargraph
	    | Nentry
	    | Attach

type faust_exp =
         Const of basic
       | Ident of symbol
       | Par   of faust_exp * faust_exp
       | Seq   of faust_exp * faust_exp
       | Rec   of faust_exp * faust_exp
       | Split of faust_exp * faust_exp
       | Merge of faust_exp * faust_exp


class type rate_type = 
  object
    method to_int : int
    method to_float : float 
    method to_string : string
    method num : int
    method denom : int
    method equal : rate_type -> bool
    method mul : int -> rate_type
    method div : int -> rate_type
  end

class type signal_type = 
    object
      method frequency : rate_type
      method at : time -> value_type
      method add_memory : int -> unit
      method add : signal_type -> signal_type
      method neg : signal_type
      method sub : signal_type -> signal_type
      method mul : signal_type -> signal_type
      method div : signal_type -> signal_type
      method power : signal_type -> signal_type
      method _and : signal_type -> signal_type
      method _or : signal_type -> signal_type
      method _xor : signal_type -> signal_type
      method delay : signal_type -> signal_type
      method mem : signal_type
      method vectorize : signal_type -> signal_type
      method serialize : signal_type
      method vconcat : signal_type -> signal_type
      method vpick : signal_type -> signal_type
      method floor : signal_type
      method ceil : signal_type
      method rint : signal_type
      method int : signal_type
      method float : signal_type
      method sin : signal_type
      method asin : signal_type
      method cos : signal_type
      method acos : signal_type
      method tan : signal_type
      method atan : signal_type
      method atan2 : signal_type -> signal_type
      method exp : signal_type
      method sqrt : signal_type
      method ln : signal_type
      method lg : signal_type
      method abs : signal_type
      method fmod : signal_type -> signal_type
      method _mod : signal_type -> signal_type
      method remainder : signal_type -> signal_type
      method gt : signal_type -> signal_type
      method lt : signal_type -> signal_type
      method geq : signal_type -> signal_type
      method leq : signal_type -> signal_type
      method eq : signal_type -> signal_type
      method neq : signal_type -> signal_type
      method shl : signal_type -> signal_type
      method shr : signal_type -> signal_type
      method max : signal_type -> signal_type
      method min : signal_type -> signal_type
      method rdtable : signal_type -> signal_type -> signal_type
      method rwtable : signal_type -> signal_type -> 
	signal_type -> signal_type -> signal_type
      method select2 : signal_type -> signal_type -> signal_type
      method select3 : signal_type -> signal_type -> signal_type -> signal_type
      method prefix : signal_type -> signal_type
    end;;

type matrix = float array array;;

type data = float array array array;;

class type beam_type =
    object
      method get : signal_type array
      method width : int
      method sub : int -> int -> beam_type
      method cut : int -> beam_type * beam_type
      method append : beam_type -> beam_type
      method matching : int -> beam_type
      method at : time -> value_type array
      method output : int -> data
      method frequency : rate_type array
    end;;


class type dimension_type = 
  object
    method input : int
    method output : int
    method par : dimension_type -> dimension_type
    method seq : dimension_type -> dimension_type
    method split : dimension_type -> dimension_type
    method merge : dimension_type -> dimension_type
    method _rec : dimension_type -> dimension_type
  end;;


class type process_type = 
    object
      method exp : faust_exp
      method dim : dimension_type
      method delay : int
      method eval : beam_type -> beam_type
    end;;


class type io_type = 
    object
      method set : string -> string -> string -> unit
      method read : string array -> beam_type
      method write : rate_type array -> data -> string array
    end;;