/*! @license
// @propjockey/doubledash.css
// BSD 2-Clause License
// Copyright © 2026 Jane Ori, PropJockey
*/

@import url("../compare/index.css");

@layer {
  @function --dd-loop-id-0() {
    result: "--dd-i: " --dd-number-to-string(var(--dd-i))
      "\A --dd-x: " --dd-number-to-string(var(--dd-x), 2)
      "\A --dd-x-start: " --dd-number-to-string(var(--dd-x-start), 2)
      "\A --dd-x-end: " --dd-number-to-string(var(--dd-x-end), 2)
      "\A --dd-arg1: " --dd-to-string(var(--dd-arg1))
      "\A --dd-arg2: " --dd-to-string(var(--dd-arg2))
      "\A --dd-arg3: " --dd-to-string(var(--dd-arg3))
      "\A --dd-arg4: " --dd-to-string(var(--dd-arg4))
      "\A\A"
    ;
  }
}

@function --_dd-O1-x(
  --dd-i <integer>: 0, --_dd-a <number>: 1, --_dd-b <number>: 1
) returns <number> {
  --_dd-a: var(--_dd-extract-a-from-partial);
  --_dd-b: var(--_dd-extract-b-from-partial);
  result: if(
    style(--_dd-a = 1): calc(
      var(--dd-x-start) + var(--dd-i) * var(--_dd-b)
    ); else: calc(
      pow(var(--_dd-a), var(--dd-i)) * var(--dd-x-start) +
      var(--_dd-b) * (pow(var(--_dd-a), var(--dd-i)) - 1) /
      (var(--_dd-a) - 1)
    );
  );
}

@function --_dd-loop-condition(
  --dd-i <integer>: 0, --dd-x <number>: 0
) returns <integer> {
  --dd-x: --_dd-O1-x(var(--dd-i));
  result: if(
    style(--dd-lte(var(--dd-i), var(--_dd-i-limit)) = 1): if(
      style(--dd-comparitor: eq): --dd-eq(var(--dd-x), var(--dd-x-end));
      style(--dd-comparitor: gt): --dd-gt(var(--dd-x), var(--dd-x-end));
      style(--dd-comparitor: gte): --dd-gte(var(--dd-x), var(--dd-x-end));
      style(--dd-comparitor: lt): --dd-lt(var(--dd-x), var(--dd-x-end));
      style(--dd-comparitor: lte): --dd-lte(var(--dd-x), var(--dd-x-end));
      style(--dd-comparitor: neq): --dd-neq(var(--dd-x), var(--dd-x-end));
      else: 0;
    ); else: 0;
  );
}

@function --_dd-global-loops(
  --dd-i <integer>: 0, --dd-x <number>: 0
) {
  --dd-x: --_dd-O1-x(var(--dd-i));
  result:
    if(style(--dd-i: 0) or style(--dd-joiner: none): ; else: var(--dd-joiner, );)
    if(
      style(--dd-use-loop: --dd-loop-id-0): --dd-loop-id-0();
      style(--dd-use-loop: --dd-loop-id-1): --dd-loop-id-1();
      style(--dd-use-loop: --dd-loop-id-2): --dd-loop-id-2();
      style(--dd-use-loop: --dd-loop-id-3): --dd-loop-id-3();
      style(--dd-use-loop: --dd-loop-id-4): --dd-loop-id-4();
      style(--dd-use-loop: --dd-loop-id-5): --dd-loop-id-5();
      style(--dd-use-loop: --dd-loop-id-6): --dd-loop-id-6();
      style(--dd-use-loop: --dd-loop-id-7): --dd-loop-id-7();
      style(--dd-use-loop: --dd-loop-id-8): --dd-loop-id-8();
      style(--dd-use-loop: --dd-loop-id-9): --dd-loop-id-9();
      style(--dd-use-loop: --dd-loop-id-10): --dd-loop-id-10();
      style(--dd-use-loop: --dd-loop-id-11): --dd-loop-id-11();
      style(--dd-use-loop: --dd-loop-id-12): --dd-loop-id-12();
      style(--dd-use-loop: --dd-loop-id-13): --dd-loop-id-13();
      style(--dd-use-loop: --dd-loop-id-14): --dd-loop-id-14();
      style(--dd-use-loop: --dd-loop-id-15): --dd-loop-id-15();
      style(--dd-use-loop: --dd-loop-id-16): --dd-loop-id-16();
      style(--dd-use-loop: --dd-loop-id-17): --dd-loop-id-17();
      style(--dd-use-loop: --dd-loop-id-18): --dd-loop-id-18();
      style(--dd-use-loop: --dd-loop-id-19): --dd-loop-id-19();
      style(--dd-use-loop: --dd-loop-id-20): --dd-loop-id-20();
      style(--dd-use-loop: --dd-loop-id-21): --dd-loop-id-21();
      style(--dd-use-loop: --dd-loop-id-22): --dd-loop-id-22();
      style(--dd-use-loop: --dd-loop-id-23): --dd-loop-id-23();
      style(--dd-use-loop: --dd-loop-id-24): --dd-loop-id-24();
      style(--dd-use-loop: --dd-loop-id-25): --dd-loop-id-25();
      style(--dd-use-loop: --dd-loop-id-26): --dd-loop-id-26();
      style(--dd-use-loop: --dd-loop-id-27): --dd-loop-id-27();
      style(--dd-use-loop: --dd-loop-id-28): --dd-loop-id-28();
      style(--dd-use-loop: --dd-loop-id-29): --dd-loop-id-29();
      style(--dd-use-loop: --dd-loop-id-30): --dd-loop-id-30();
      style(--dd-use-loop: --dd-loop-id-31): --dd-loop-id-31();
      style(--dd-use-loop: --dd-loop-id-32): --dd-loop-id-32();
      style(--dd-use-loop: --dd-loop-id-33): --dd-loop-id-33();
      style(--dd-use-loop: --dd-loop-id-34): --dd-loop-id-34();
      style(--dd-use-loop: --dd-loop-id-35): --dd-loop-id-35();
      style(--dd-use-loop: --dd-loop-id-36): --dd-loop-id-36();
      style(--dd-use-loop: --dd-loop-id-37): --dd-loop-id-37();
      style(--dd-use-loop: --dd-loop-id-38): --dd-loop-id-38();
      style(--dd-use-loop: --dd-loop-id-39): --dd-loop-id-39();
      style(--dd-use-loop: --dd-loop-id-40): --dd-loop-id-40();
      style(--dd-use-loop: --dd-loop-id-41): --dd-loop-id-41();
      style(--dd-use-loop: --dd-loop-id-42): --dd-loop-id-42();
      style(--dd-use-loop: --dd-loop-id-43): --dd-loop-id-43();
      style(--dd-use-loop: --dd-loop-id-44): --dd-loop-id-44();
      style(--dd-use-loop: --dd-loop-id-45): --dd-loop-id-45();
      style(--dd-use-loop: --dd-loop-id-46): --dd-loop-id-46();
      style(--dd-use-loop: --dd-loop-id-47): --dd-loop-id-47();
      style(--dd-use-loop: --dd-loop-id-48): --dd-loop-id-48();
      style(--dd-use-loop: --dd-loop-id-49): --dd-loop-id-49();
      style(--dd-use-loop: --dd-loop-id-50): --dd-loop-id-50();
      style(--dd-use-loop: --dd-loop-id-51): --dd-loop-id-51();
      style(--dd-use-loop: --dd-loop-id-52): --dd-loop-id-52();
      style(--dd-use-loop: --dd-loop-id-53): --dd-loop-id-53();
      style(--dd-use-loop: --dd-loop-id-54): --dd-loop-id-54();
      style(--dd-use-loop: --dd-loop-id-55): --dd-loop-id-55();
      style(--dd-use-loop: --dd-loop-id-56): --dd-loop-id-56();
      style(--dd-use-loop: --dd-loop-id-57): --dd-loop-id-57();
      style(--dd-use-loop: --dd-loop-id-58): --dd-loop-id-58();
      style(--dd-use-loop: --dd-loop-id-59): --dd-loop-id-59();
      style(--dd-use-loop: --dd-loop-id-60): --dd-loop-id-60();
      style(--dd-use-loop: --dd-loop-id-61): --dd-loop-id-61();
      style(--dd-use-loop: --dd-loop-id-62): --dd-loop-id-62();
      style(--dd-use-loop: --dd-loop-id-63): --dd-loop-id-63();
      else: "loop not registered";
    )
  ;
}

@function --_dd-loop-compound-d(--_dd-offset-i <integer>: 0) {
  result: --_dd-global-loops(var(--_dd-offset-i)) if(
    style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 1)) = 1):
      --_dd-global-loops(calc(var(--_dd-offset-i) + 1)) if(
      style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 2)) = 1):
        --_dd-global-loops(calc(var(--_dd-offset-i) + 2)) if(
        style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 3)) = 1):
          --_dd-global-loops(calc(var(--_dd-offset-i) + 3))
          ; else: ;
      ); else: ;
    ); else: ;
  );
}

@function --_dd-loop-compound-c(--_dd-offset-i <integer>: 0) {
  result: --_dd-loop-compound-d(var(--_dd-offset-i)) if(
    style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 4)) = 1):
      --_dd-loop-compound-d(calc(var(--_dd-offset-i) + 4)) if(
      style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 8)) = 1):
        --_dd-loop-compound-d(calc(var(--_dd-offset-i) + 8)) if(
        style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 12)) = 1):
          --_dd-loop-compound-d(calc(var(--_dd-offset-i) + 12))
        ; else: ;
      ); else: ;
    ); else: ;
  );
}

@function --_dd-loop-compound-b(--_dd-offset-i <integer>: 0) {
  result: --_dd-loop-compound-c(var(--_dd-offset-i)) if(
    style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 16)) = 1):
      --_dd-loop-compound-c(calc(var(--_dd-offset-i) + 16)) if(
      style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 32)) = 1):
        --_dd-loop-compound-c(calc(var(--_dd-offset-i) + 32)) if(
        style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 48)) = 1):
          --_dd-loop-compound-c(calc(var(--_dd-offset-i) + 48))
        ; else: ;
      ); else: ;
    ); else: ;
  );
}

@function --_dd-loop-compound-a(--_dd-offset-i <integer>: 0) {
  result: --_dd-loop-compound-b(var(--_dd-offset-i)) if(
    style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 64)) = 1):
      --_dd-loop-compound-b(calc(var(--_dd-offset-i) + 64)) if(
      style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 128)) = 1):
        --_dd-loop-compound-b(calc(var(--_dd-offset-i) + 128)) if(
        style(--_dd-loop-condition(calc(var(--_dd-offset-i) + 192)) = 1):
          --_dd-loop-compound-b(calc(var(--_dd-offset-i) + 192))
        ; else: ;
      ); else: ;
    ); else: ;
  );
}

@function --_dd-O1-iterations-required(
  --_dd-a <number>: 1, --_dd-b <number>: 1, --_dd-reachability <number>: 1
) returns <number> {
  --_dd-a: var(--_dd-extract-a-from-partial);
  --_dd-b: var(--_dd-extract-b-from-partial);
  --_dd-reachability: if(
    style(--_dd-a = 1): calc(
      (var(--dd-x-end) - var(--dd-x-start)) / var(--_dd-b)
    ); else: calc(
      (var(--dd-x-end) * (var(--_dd-a) - 1) + var(--_dd-b)) /
      (var(--dd-x-start) * (var(--_dd-a) - 1) + var(--_dd-b))
    );
  );
  --_dd-is-reachable: if(
    style(--_dd-a = 1): --dd-gte(var(--_dd-reachability), 0);
    else: --dd-gt(var(--_dd-reachability), 0);
  );
  result: if(
    style(--_dd-is-reachable = 0): 1023;
    style(--_dd-a = 1): var(--_dd-reachability);
    else: calc(log(var(--_dd-reachability)) / log(var(--_dd-a)));
  );
}

@function --dd-loop(
  --dd-x-start,
  --dd-comparitor,
  --dd-x-end,
  --dd-calc-partial-iter,
  --dd-use-loop,
  --dd-joiner: ,
  --dd-arg1: initial,
  --dd-arg2: initial,
  --dd-arg3: initial,
  --dd-arg4: initial
) {
  /* --dd-calc-partial-iter is generically only possibly in the form of "* a + b" */
  /* We don't know what a & b are in the calc partial, but we can solve for them! */
  /* (divide and subtract are the same as multiply and and add so it still holds) */
  /* We first generate the next 2 iterations as a basis. Once a and b are solved, */
  /* the rest of the iterations can be generically solved in O(1), w/o iteration. */
  /* Necessary to avoid max calc depth - else we'd have to register tons of vars. */
  --_dd-x-0: var(--dd-x-start);
  --_dd-x-1: calc(var(--_dd-x-0) var(--dd-calc-partial-iter));
  --_dd-x-2: calc(var(--_dd-x-1) var(--dd-calc-partial-iter));
  --_dd-extract-a-from-partial: calc(
    (var(--_dd-x-2) - var(--_dd-x-1)) / (var(--_dd-x-1) - var(--_dd-x-0))
  );
  --_dd-extract-b-from-partial: calc(
    var(--_dd-x-1) - var(--_dd-x-0) * var(--_dd-extract-a-from-partial)
  );
  --_dd-i-limit: --_dd-O1-iterations-required();
  result: if(
    style(--_dd-loop-condition(0) = 1):
      --_dd-loop-compound-a(0) if(
      style(--_dd-loop-condition(256) = 1):
        --_dd-loop-compound-a(256) if(
        style(--_dd-loop-condition(512) = 1):
          --_dd-loop-compound-a(512) if(
          style(--_dd-loop-condition(768) = 1):
            --_dd-loop-compound-a(768)
          ; else: ;
        ); else: ;
      ); else: ;
    ); else: ;
  );
}

/*
:root { --my-loop-alias: --dd-loop-id-0; }
body::after {
  white-space: pre;
  content: --dd-loop(0, lt, 10, * 1.05 + 2, var(--my-loop-alias), none, {"asdef" "hi"}, var(--xxxx, ), 10.2dpcm);
}
*/
