((Ptop_funcdef
  ((name ((binder_name sma)))
   (decl_params
    (((((binder_name data))
       ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
      (((binder_name period)) ((Ptype_name ((lid Int)) ()))))))
   (quantifiers ())
   (return_type
    ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
   (error_type No_error_typ) (vis (Vis_pub ()))
   (doc_
    ((comment
      (" Simple Moving Average (SMA)"
       " Returns array of same length as input; first (period-1) values are NaN."))
     (loc 3:1-4:76))))
  (Decl_body
   (Pexpr_let (Ppat_var ((binder_name n)))
    (Pexpr_dot_apply (Pexpr_ident ((var_name data))) ((label_name length))
     ())
    (Pexpr_let
     (Ppat_constraint (Ppat_var ((binder_name result)))
      (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
     (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
      ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
     (Pexpr_sequence
      ((Pexpr_if
        (Pexpr_infix ((var_name ||))
         (Pexpr_infix ((var_name <=)) (Pexpr_ident ((var_name period)))
          (Pexpr_constant 0))
         (Pexpr_infix ((var_name >)) (Pexpr_ident ((var_name period)))
          (Pexpr_ident ((var_name n)))))
        (Pexpr_return ((Pexpr_ident ((var_name result))))) ()))
      (Pexpr_letmut ((binder_name sum)) () (Pexpr_constant 0.0)
       (Pexpr_sequence
        ((Pexpr_for ((((binder_name i)) (Pexpr_constant 0)))
          ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
            (Pexpr_ident ((var_name period)))))
          ((((binder_name i))
            (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
             (Pexpr_constant 1))))
          (Pexpr_assign ((var_name sum))
           (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name sum)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
             ((label_name op_get)) ((Pexpr_ident ((var_name i)))))))
          ())
         (Pexpr_dot_apply (Pexpr_ident ((var_name result)))
          ((label_name op_set))
          ((Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name period)))
            (Pexpr_constant 1))
           (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name sum)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
             ((label_name to_double)) ()))))
         (Pexpr_for ((((binder_name i)) (Pexpr_ident ((var_name period)))))
          ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
            (Pexpr_ident ((var_name n)))))
          ((((binder_name i))
            (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
             (Pexpr_constant 1))))
          (Pexpr_sequence
           ((Pexpr_assign ((var_name sum))
             (Pexpr_infix ((var_name -))
              (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name sum)))
               (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
                ((label_name op_get)) ((Pexpr_ident ((var_name i))))))
              (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
               ((label_name op_get))
               ((Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name i)))
                 (Pexpr_ident ((var_name period)))))))))
           (Pexpr_dot_apply (Pexpr_ident ((var_name result)))
            ((label_name op_set))
            ((Pexpr_ident ((var_name i)))
             (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name sum)))
              (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
               ((label_name to_double)) ())))))
          ()))
        (Pexpr_ident ((var_name result))))))))))
 (Ptop_funcdef
  ((name ((binder_name ema)))
   (decl_params
    (((((binder_name data))
       ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
      (((binder_name period)) ((Ptype_name ((lid Int)) ()))))))
   (quantifiers ())
   (return_type
    ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
   (error_type No_error_typ) (vis (Vis_pub ()))
   (doc_
    ((comment
      (" Exponential Moving Average (EMA)"
       " Uses smoothing factor k = 2 / (period + 1)."))
     (loc 23:1-24:48))))
  (Decl_body
   (Pexpr_let (Ppat_var ((binder_name n)))
    (Pexpr_dot_apply (Pexpr_ident ((var_name data))) ((label_name length))
     ())
    (Pexpr_let
     (Ppat_constraint (Ppat_var ((binder_name result)))
      (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
     (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
      ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
     (Pexpr_sequence
      ((Pexpr_if
        (Pexpr_infix ((var_name ||))
         (Pexpr_infix ((var_name <=)) (Pexpr_ident ((var_name period)))
          (Pexpr_constant 0))
         (Pexpr_infix ((var_name >)) (Pexpr_ident ((var_name period)))
          (Pexpr_ident ((var_name n)))))
        (Pexpr_return ((Pexpr_ident ((var_name result))))) ()))
      (Pexpr_letmut ((binder_name sum)) () (Pexpr_constant 0.0)
       (Pexpr_sequence
        ((Pexpr_for ((((binder_name i)) (Pexpr_constant 0)))
          ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
            (Pexpr_ident ((var_name period)))))
          ((((binder_name i))
            (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
             (Pexpr_constant 1))))
          (Pexpr_assign ((var_name sum))
           (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name sum)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
             ((label_name op_get)) ((Pexpr_ident ((var_name i)))))))
          ()))
        (Pexpr_let (Ppat_var ((binder_name seed)))
         (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name sum)))
          (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
           ((label_name to_double)) ()))
         (Pexpr_sequence
          ((Pexpr_dot_apply (Pexpr_ident ((var_name result)))
            ((label_name op_set))
            ((Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name period)))
              (Pexpr_constant 1))
             (Pexpr_ident ((var_name seed))))))
          (Pexpr_let (Ppat_var ((binder_name k)))
           (Pexpr_infix ((var_name /)) (Pexpr_constant 2.0)
            (Pexpr_infix ((var_name +))
             (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
              ((label_name to_double)) ())
             (Pexpr_constant 1.0)))
           (Pexpr_letmut ((binder_name prev)) ()
            (Pexpr_ident ((var_name seed)))
            (Pexpr_sequence
             ((Pexpr_for
               ((((binder_name i)) (Pexpr_ident ((var_name period)))))
               ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
                 (Pexpr_ident ((var_name n)))))
               ((((binder_name i))
                 (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
                  (Pexpr_constant 1))))
               (Pexpr_let (Ppat_var ((binder_name val)))
                (Pexpr_infix ((var_name +))
                 (Pexpr_infix ((var_name *))
                  (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
                   ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
                  (Pexpr_ident ((var_name k))))
                 (Pexpr_infix ((var_name *)) (Pexpr_ident ((var_name prev)))
                  (Pexpr_infix ((var_name -)) (Pexpr_constant 1.0)
                   (Pexpr_ident ((var_name k))))))
                (Pexpr_sequence
                 ((Pexpr_dot_apply (Pexpr_ident ((var_name result)))
                   ((label_name op_set))
                   ((Pexpr_ident ((var_name i)))
                    (Pexpr_ident ((var_name val))))))
                 (Pexpr_assign ((var_name prev))
                  (Pexpr_ident ((var_name val))))))
               ()))
             (Pexpr_ident ((var_name result)))))))))))))))
 (Ptop_funcdef
  ((name ((binder_name macd)))
   (decl_params
    (((((binder_name data))
       ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
      (((binder_name fast_period)) ((Ptype_name ((lid Int)) ())))
      (((binder_name slow_period)) ((Ptype_name ((lid Int)) ())))
      (((binder_name signal_period)) ((Ptype_name ((lid Int)) ()))))))
   (quantifiers ())
   (return_type
    ((Ptype_tuple
      ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))
       (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))
       (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))))
   (error_type No_error_typ) (vis (Vis_pub ()))
   (doc_
    ((comment
      (" MACD (Moving Average Convergence Divergence)"
       " Returns (macd_line, signal_line, histogram)."))
     (loc 48:1-49:49))))
  (Decl_body
   (Pexpr_let (Ppat_var ((binder_name n)))
    (Pexpr_dot_apply (Pexpr_ident ((var_name data))) ((label_name length))
     ())
    (Pexpr_let (Ppat_var ((binder_name ema_fast)))
     (Pexpr_apply (Pexpr_ident ((var_name ema)))
      ((Pexpr_ident ((var_name data)))
       (Pexpr_ident ((var_name fast_period)))))
     (Pexpr_let (Ppat_var ((binder_name ema_slow)))
      (Pexpr_apply (Pexpr_ident ((var_name ema)))
       ((Pexpr_ident ((var_name data)))
        (Pexpr_ident ((var_name slow_period)))))
      (Pexpr_let
       (Ppat_constraint (Ppat_var ((binder_name macd_line)))
        (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
       (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
        ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
       (Pexpr_sequence
        ((Pexpr_for ((((binder_name i)) (Pexpr_constant 0)))
          ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
            (Pexpr_ident ((var_name n)))))
          ((((binder_name i))
            (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
             (Pexpr_constant 1))))
          (Pexpr_if
           (Pexpr_infix ((var_name &&))
            (Pexpr_apply (Pexpr_ident ((var_name not)))
             ((Pexpr_dot_apply
               (Pexpr_dot_apply (Pexpr_ident ((var_name ema_fast)))
                ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
               ((label_name is_nan)) ())))
            (Pexpr_apply (Pexpr_ident ((var_name not)))
             ((Pexpr_dot_apply
               (Pexpr_dot_apply (Pexpr_ident ((var_name ema_slow)))
                ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
               ((label_name is_nan)) ()))))
           (Pexpr_dot_apply (Pexpr_ident ((var_name macd_line)))
            ((label_name op_set))
            ((Pexpr_ident ((var_name i)))
             (Pexpr_infix ((var_name -))
              (Pexpr_dot_apply (Pexpr_ident ((var_name ema_fast)))
               ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
              (Pexpr_dot_apply (Pexpr_ident ((var_name ema_slow)))
               ((label_name op_get)) ((Pexpr_ident ((var_name i))))))))
           ())
          ()))
        (Pexpr_let (Ppat_var ((binder_name valid_start)))
         (Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name slow_period)))
          (Pexpr_constant 1))
         (Pexpr_let
          (Ppat_constraint (Ppat_var ((binder_name valid_data)))
           (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
          (Pexpr_array ())
          (Pexpr_sequence
           ((Pexpr_for
             ((((binder_name i)) (Pexpr_ident ((var_name valid_start)))))
             ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
               (Pexpr_ident ((var_name n)))))
             ((((binder_name i))
               (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
                (Pexpr_constant 1))))
             (Pexpr_dot_apply (Pexpr_ident ((var_name valid_data)))
              ((label_name push))
              ((Pexpr_dot_apply (Pexpr_ident ((var_name macd_line)))
                ((label_name op_get)) ((Pexpr_ident ((var_name i)))))))
             ()))
           (Pexpr_let (Ppat_var ((binder_name signal_raw)))
            (Pexpr_apply (Pexpr_ident ((var_name ema)))
             ((Pexpr_ident ((var_name valid_data)))
              (Pexpr_ident ((var_name signal_period)))))
            (Pexpr_let
             (Ppat_constraint (Ppat_var ((binder_name signal_line)))
              (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
             (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
              ((Pexpr_ident ((var_name n)))
               (Pexpr_ident ((var_name @double.nan)))))
             (Pexpr_let
              (Ppat_constraint (Ppat_var ((binder_name histogram)))
               (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
              (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
               ((Pexpr_ident ((var_name n)))
                (Pexpr_ident ((var_name @double.nan)))))
              (Pexpr_sequence
               ((Pexpr_for ((((binder_name i)) (Pexpr_constant 0)))
                 ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
                   (Pexpr_dot_apply (Pexpr_ident ((var_name valid_data)))
                    ((label_name length)) ())))
                 ((((binder_name i))
                   (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
                    (Pexpr_constant 1))))
                 (Pexpr_let (Ppat_var ((binder_name idx)))
                  (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
                   (Pexpr_ident ((var_name valid_start))))
                  (Pexpr_sequence
                   ((Pexpr_dot_apply (Pexpr_ident ((var_name signal_line)))
                     ((label_name op_set))
                     ((Pexpr_ident ((var_name idx)))
                      (Pexpr_dot_apply (Pexpr_ident ((var_name signal_raw)))
                       ((label_name op_get)) ((Pexpr_ident ((var_name i))))))))
                   (Pexpr_if
                    (Pexpr_infix ((var_name &&))
                     (Pexpr_apply (Pexpr_ident ((var_name not)))
                      ((Pexpr_dot_apply
                        (Pexpr_dot_apply
                         (Pexpr_ident ((var_name signal_raw)))
                         ((label_name op_get))
                         ((Pexpr_ident ((var_name i)))))
                        ((label_name is_nan)) ())))
                     (Pexpr_apply (Pexpr_ident ((var_name not)))
                      ((Pexpr_dot_apply
                        (Pexpr_dot_apply (Pexpr_ident ((var_name macd_line)))
                         ((label_name op_get))
                         ((Pexpr_ident ((var_name idx)))))
                        ((label_name is_nan)) ()))))
                    (Pexpr_dot_apply (Pexpr_ident ((var_name histogram)))
                     ((label_name op_set))
                     ((Pexpr_ident ((var_name idx)))
                      (Pexpr_infix ((var_name -))
                       (Pexpr_dot_apply (Pexpr_ident ((var_name macd_line)))
                        ((label_name op_get))
                        ((Pexpr_ident ((var_name idx)))))
                       (Pexpr_dot_apply (Pexpr_ident ((var_name signal_raw)))
                        ((label_name op_get)) ((Pexpr_ident ((var_name i))))))))
                    ())))
                 ()))
               (Pexpr_tuple
                ((Pexpr_ident ((var_name macd_line)))
                 (Pexpr_ident ((var_name signal_line)))
                 (Pexpr_ident ((var_name histogram)))))))))))))))))))
 (Ptop_funcdef
  ((name ((binder_name rsi)))
   (decl_params
    (((((binder_name data))
       ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
      (((binder_name period)) ((Ptype_name ((lid Int)) ()))))))
   (quantifiers ())
   (return_type
    ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
   (error_type No_error_typ) (vis (Vis_pub ()))
   (doc_
    ((comment
      (" Relative Strength Index (RSI)" " Uses Wilder's smoothing method."))
     (loc 86:1-87:36))))
  (Decl_body
   (Pexpr_let (Ppat_var ((binder_name n)))
    (Pexpr_dot_apply (Pexpr_ident ((var_name data))) ((label_name length))
     ())
    (Pexpr_let
     (Ppat_constraint (Ppat_var ((binder_name result)))
      (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
     (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
      ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
     (Pexpr_sequence
      ((Pexpr_if
        (Pexpr_infix ((var_name ||))
         (Pexpr_infix ((var_name <=)) (Pexpr_ident ((var_name period)))
          (Pexpr_constant 0))
         (Pexpr_infix ((var_name >=)) (Pexpr_ident ((var_name period)))
          (Pexpr_ident ((var_name n)))))
        (Pexpr_return ((Pexpr_ident ((var_name result))))) ()))
      (Pexpr_letmut ((binder_name avg_gain)) () (Pexpr_constant 0.0)
       (Pexpr_letmut ((binder_name avg_loss)) () (Pexpr_constant 0.0)
        (Pexpr_sequence
         ((Pexpr_for ((((binder_name i)) (Pexpr_constant 1)))
           ((Pexpr_infix ((var_name <=)) (Pexpr_ident ((var_name i)))
             (Pexpr_ident ((var_name period)))))
           ((((binder_name i))
             (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
              (Pexpr_constant 1))))
           (Pexpr_let (Ppat_var ((binder_name change)))
            (Pexpr_infix ((var_name -))
             (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
              ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
             (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
              ((label_name op_get))
              ((Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name i)))
                (Pexpr_constant 1)))))
            (Pexpr_if
             (Pexpr_infix ((var_name >)) (Pexpr_ident ((var_name change)))
              (Pexpr_constant 0.0))
             (Pexpr_assign ((var_name avg_gain))
              (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name avg_gain)))
               (Pexpr_ident ((var_name change)))))
             ((Pexpr_assign ((var_name avg_loss))
               (Pexpr_infix ((var_name -))
                (Pexpr_ident ((var_name avg_loss)))
                (Pexpr_ident ((var_name change))))))))
           ())
          (Pexpr_assign ((var_name avg_gain))
           (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name avg_gain)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
             ((label_name to_double)) ())))
          (Pexpr_assign ((var_name avg_loss))
           (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name avg_loss)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
             ((label_name to_double)) ())))
          (Pexpr_if
           (Pexpr_infix ((var_name ==)) (Pexpr_ident ((var_name avg_loss)))
            (Pexpr_constant 0.0))
           (Pexpr_dot_apply (Pexpr_ident ((var_name result)))
            ((label_name op_set))
            ((Pexpr_ident ((var_name period))) (Pexpr_constant 100.0)))
           ((Pexpr_dot_apply (Pexpr_ident ((var_name result)))
             ((label_name op_set))
             ((Pexpr_ident ((var_name period)))
              (Pexpr_infix ((var_name -)) (Pexpr_constant 100.0)
               (Pexpr_infix ((var_name /)) (Pexpr_constant 100.0)
                (Pexpr_infix ((var_name +)) (Pexpr_constant 1.0)
                 (Pexpr_infix ((var_name /))
                  (Pexpr_ident ((var_name avg_gain)))
                  (Pexpr_ident ((var_name avg_loss))))))))))))
         (Pexpr_let (Ppat_var ((binder_name period_f)))
          (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
           ((label_name to_double)) ())
          (Pexpr_sequence
           ((Pexpr_for
             ((((binder_name i))
               (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name period)))
                (Pexpr_constant 1))))
             ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
               (Pexpr_ident ((var_name n)))))
             ((((binder_name i))
               (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
                (Pexpr_constant 1))))
             (Pexpr_let (Ppat_var ((binder_name change)))
              (Pexpr_infix ((var_name -))
               (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
                ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
               (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
                ((label_name op_get))
                ((Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name i)))
                  (Pexpr_constant 1)))))
              (Pexpr_let (Ppat_var ((binder_name gain)))
               (Pexpr_if
                (Pexpr_infix ((var_name >)) (Pexpr_ident ((var_name change)))
                 (Pexpr_constant 0.0))
                (Pexpr_ident ((var_name change))) ((Pexpr_constant 0.0)))
               (Pexpr_let (Ppat_var ((binder_name loss)))
                (Pexpr_if
                 (Pexpr_infix ((var_name <))
                  (Pexpr_ident ((var_name change))) (Pexpr_constant 0.0))
                 (Pexpr_unary ((var_name -))
                  (Pexpr_ident ((var_name change))))
                 ((Pexpr_constant 0.0)))
                (Pexpr_sequence
                 ((Pexpr_assign ((var_name avg_gain))
                   (Pexpr_infix ((var_name /))
                    (Pexpr_infix ((var_name +))
                     (Pexpr_infix ((var_name *))
                      (Pexpr_ident ((var_name avg_gain)))
                      (Pexpr_infix ((var_name -))
                       (Pexpr_ident ((var_name period_f)))
                       (Pexpr_constant 1.0)))
                     (Pexpr_ident ((var_name gain))))
                    (Pexpr_ident ((var_name period_f)))))
                  (Pexpr_assign ((var_name avg_loss))
                   (Pexpr_infix ((var_name /))
                    (Pexpr_infix ((var_name +))
                     (Pexpr_infix ((var_name *))
                      (Pexpr_ident ((var_name avg_loss)))
                      (Pexpr_infix ((var_name -))
                       (Pexpr_ident ((var_name period_f)))
                       (Pexpr_constant 1.0)))
                     (Pexpr_ident ((var_name loss))))
                    (Pexpr_ident ((var_name period_f))))))
                 (Pexpr_if
                  (Pexpr_infix ((var_name ==))
                   (Pexpr_ident ((var_name avg_loss))) (Pexpr_constant 0.0))
                  (Pexpr_dot_apply (Pexpr_ident ((var_name result)))
                   ((label_name op_set))
                   ((Pexpr_ident ((var_name i))) (Pexpr_constant 100.0)))
                  ((Pexpr_dot_apply (Pexpr_ident ((var_name result)))
                    ((label_name op_set))
                    ((Pexpr_ident ((var_name i)))
                     (Pexpr_infix ((var_name -)) (Pexpr_constant 100.0)
                      (Pexpr_infix ((var_name /)) (Pexpr_constant 100.0)
                       (Pexpr_infix ((var_name +)) (Pexpr_constant 1.0)
                        (Pexpr_infix ((var_name /))
                         (Pexpr_ident ((var_name avg_gain)))
                         (Pexpr_ident ((var_name avg_loss)))))))))))))))
             ()))
           (Pexpr_ident ((var_name result)))))))))))))
 (Ptop_funcdef
  ((name ((binder_name bollinger_bands)))
   (decl_params
    (((((binder_name data))
       ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))
      (((binder_name period)) ((Ptype_name ((lid Int)) ())))
      (((binder_name num_std)) ((Ptype_name ((lid Double)) ()))))))
   (quantifiers ())
   (return_type
    ((Ptype_tuple
      ((Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))
       (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))
       (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ())))))))
   (error_type No_error_typ) (vis (Vis_pub ()))
   (doc_
    ((comment (" Bollinger Bands" " Returns (upper, middle, lower)."))
     (loc 129:1-130:36))))
  (Decl_body
   (Pexpr_let (Ppat_var ((binder_name n)))
    (Pexpr_dot_apply (Pexpr_ident ((var_name data))) ((label_name length))
     ())
    (Pexpr_let (Ppat_var ((binder_name middle)))
     (Pexpr_apply (Pexpr_ident ((var_name sma)))
      ((Pexpr_ident ((var_name data))) (Pexpr_ident ((var_name period)))))
     (Pexpr_let
      (Ppat_constraint (Ppat_var ((binder_name upper)))
       (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
      (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
       ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
      (Pexpr_let
       (Ppat_constraint (Ppat_var ((binder_name lower)))
        (Ptype_name ((lid Array)) ((Ptype_name ((lid Double)) ()))))
       (Pexpr_apply (Pexpr_method ((name Array)) ((label_name make)))
        ((Pexpr_ident ((var_name n))) (Pexpr_ident ((var_name @double.nan)))))
       (Pexpr_sequence
        ((Pexpr_for
          ((((binder_name i))
            (Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name period)))
             (Pexpr_constant 1))))
          ((Pexpr_infix ((var_name <)) (Pexpr_ident ((var_name i)))
            (Pexpr_ident ((var_name n)))))
          ((((binder_name i))
            (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name i)))
             (Pexpr_constant 1))))
          (Pexpr_letmut ((binder_name sum_sq)) () (Pexpr_constant 0.0)
           (Pexpr_let (Ppat_var ((binder_name mean)))
            (Pexpr_dot_apply (Pexpr_ident ((var_name middle)))
             ((label_name op_get)) ((Pexpr_ident ((var_name i)))))
            (Pexpr_sequence
             ((Pexpr_for
               ((((binder_name j))
                 (Pexpr_infix ((var_name +))
                  (Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name i)))
                   (Pexpr_ident ((var_name period))))
                  (Pexpr_constant 1))))
               ((Pexpr_infix ((var_name <=)) (Pexpr_ident ((var_name j)))
                 (Pexpr_ident ((var_name i)))))
               ((((binder_name j))
                 (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name j)))
                  (Pexpr_constant 1))))
               (Pexpr_let (Ppat_var ((binder_name diff)))
                (Pexpr_infix ((var_name -))
                 (Pexpr_dot_apply (Pexpr_ident ((var_name data)))
                  ((label_name op_get)) ((Pexpr_ident ((var_name j)))))
                 (Pexpr_ident ((var_name mean))))
                (Pexpr_assign ((var_name sum_sq))
                 (Pexpr_infix ((var_name +))
                  (Pexpr_ident ((var_name sum_sq)))
                  (Pexpr_infix ((var_name *)) (Pexpr_ident ((var_name diff)))
                   (Pexpr_ident ((var_name diff)))))))
               ()))
             (Pexpr_let (Ppat_var ((binder_name std)))
              (Pexpr_dot_apply
               (Pexpr_infix ((var_name /)) (Pexpr_ident ((var_name sum_sq)))
                (Pexpr_dot_apply (Pexpr_ident ((var_name period)))
                 ((label_name to_double)) ()))
               ((label_name sqrt)) ())
              (Pexpr_sequence
               ((Pexpr_dot_apply (Pexpr_ident ((var_name upper)))
                 ((label_name op_set))
                 ((Pexpr_ident ((var_name i)))
                  (Pexpr_infix ((var_name +)) (Pexpr_ident ((var_name mean)))
                   (Pexpr_infix ((var_name *))
                    (Pexpr_ident ((var_name num_std)))
                    (Pexpr_ident ((var_name std))))))))
               (Pexpr_dot_apply (Pexpr_ident ((var_name lower)))
                ((label_name op_set))
                ((Pexpr_ident ((var_name i)))
                 (Pexpr_infix ((var_name -)) (Pexpr_ident ((var_name mean)))
                  (Pexpr_infix ((var_name *))
                   (Pexpr_ident ((var_name num_std)))
                   (Pexpr_ident ((var_name std))))))))))))
          ()))
        (Pexpr_tuple
         ((Pexpr_ident ((var_name upper))) (Pexpr_ident ((var_name middle)))
          (Pexpr_ident ((var_name lower)))))))))))))