1 # RFC 7541 Appendix B Huffman alphabet and streaming codec. 2 import Base 3 import bend-kit-bytes@0.3.2.0/bytes.bend as Bytes 4 5 type Code is Data: 6 Code{bits: U32, width: U32} 7 8 def code(+octet: U32) -> Code: 9 match octet: 10 case 0: 11 Code{8184, 13} 12 case 1: 13 Code{8388568, 23} 14 case 2: 15 Code{268435426, 28} 16 case 3: 17 Code{268435427, 28} 18 case 4: 19 Code{268435428, 28} 20 case 5: 21 Code{268435429, 28} 22 case 6: 23 Code{268435430, 28} 24 case 7: 25 Code{268435431, 28} 26 case 8: 27 Code{268435432, 28} 28 case 9: 29 Code{16777194, 24} 30 case 10: 31 Code{1073741820, 30} 32 case 11: 33 Code{268435433, 28} 34 case 12: 35 Code{268435434, 28} 36 case 13: 37 Code{1073741821, 30} 38 case 14: 39 Code{268435435, 28} 40 case 15: 41 Code{268435436, 28} 42 case 16: 43 Code{268435437, 28} 44 case 17: 45 Code{268435438, 28} 46 case 18: 47 Code{268435439, 28} 48 case 19: 49 Code{268435440, 28} 50 case 20: 51 Code{268435441, 28} 52 case 21: 53 Code{268435442, 28} 54 case 22: 55 Code{1073741822, 30} 56 case 23: 57 Code{268435443, 28} 58 case 24: 59 Code{268435444, 28} 60 case 25: 61 Code{268435445, 28} 62 case 26: 63 Code{268435446, 28} 64 case 27: 65 Code{268435447, 28} 66 case 28: 67 Code{268435448, 28} 68 case 29: 69 Code{268435449, 28} 70 case 30: 71 Code{268435450, 28} 72 case 31: 73 Code{268435451, 28} 74 case 32: 75 Code{20, 6} 76 case 33: 77 Code{1016, 10} 78 case 34: 79 Code{1017, 10} 80 case 35: 81 Code{4090, 12} 82 case 36: 83 Code{8185, 13} 84 case 37: 85 Code{21, 6} 86 case 38: 87 Code{248, 8} 88 case 39: 89 Code{2042, 11} 90 case 40: 91 Code{1018, 10} 92 case 41: 93 Code{1019, 10} 94 case 42: 95 Code{249, 8} 96 case 43: 97 Code{2043, 11} 98 case 44: 99 Code{250, 8} 100 case 45: 101 Code{22, 6} 102 case 46: 103 Code{23, 6} 104 case 47: 105 Code{24, 6} 106 case 48: 107 Code{0, 5} 108 case 49: 109 Code{1, 5} 110 case 50: 111 Code{2, 5} 112 case 51: 113 Code{25, 6} 114 case 52: 115 Code{26, 6} 116 case 53: 117 Code{27, 6} 118 case 54: 119 Code{28, 6} 120 case 55: 121 Code{29, 6} 122 case 56: 123 Code{30, 6} 124 case 57: 125 Code{31, 6} 126 case 58: 127 Code{92, 7} 128 case 59: 129 Code{251, 8} 130 case 60: 131 Code{32764, 15} 132 case 61: 133 Code{32, 6} 134 case 62: 135 Code{4091, 12} 136 case 63: 137 Code{1020, 10} 138 case 64: 139 Code{8186, 13} 140 case 65: 141 Code{33, 6} 142 case 66: 143 Code{93, 7} 144 case 67: 145 Code{94, 7} 146 case 68: 147 Code{95, 7} 148 case 69: 149 Code{96, 7} 150 case 70: 151 Code{97, 7} 152 case 71: 153 Code{98, 7} 154 case 72: 155 Code{99, 7} 156 case 73: 157 Code{100, 7} 158 case 74: 159 Code{101, 7} 160 case 75: 161 Code{102, 7} 162 case 76: 163 Code{103, 7} 164 case 77: 165 Code{104, 7} 166 case 78: 167 Code{105, 7} 168 case 79: 169 Code{106, 7} 170 case 80: 171 Code{107, 7} 172 case 81: 173 Code{108, 7} 174 case 82: 175 Code{109, 7} 176 case 83: 177 Code{110, 7} 178 case 84: 179 Code{111, 7} 180 case 85: 181 Code{112, 7} 182 case 86: 183 Code{113, 7} 184 case 87: 185 Code{114, 7} 186 case 88: 187 Code{252, 8} 188 case 89: 189 Code{115, 7} 190 case 90: 191 Code{253, 8} 192 case 91: 193 Code{8187, 13} 194 case 92: 195 Code{524272, 19} 196 case 93: 197 Code{8188, 13} 198 case 94: 199 Code{16380, 14} 200 case 95: 201 Code{34, 6} 202 case 96: 203 Code{32765, 15} 204 case 97: 205 Code{3, 5} 206 case 98: 207 Code{35, 6} 208 case 99: 209 Code{4, 5} 210 case 100: 211 Code{36, 6} 212 case 101: 213 Code{5, 5} 214 case 102: 215 Code{37, 6} 216 case 103: 217 Code{38, 6} 218 case 104: 219 Code{39, 6} 220 case 105: 221 Code{6, 5} 222 case 106: 223 Code{116, 7} 224 case 107: 225 Code{117, 7} 226 case 108: 227 Code{40, 6} 228 case 109: 229 Code{41, 6} 230 case 110: 231 Code{42, 6} 232 case 111: 233 Code{7, 5} 234 case 112: 235 Code{43, 6} 236 case 113: 237 Code{118, 7} 238 case 114: 239 Code{44, 6} 240 case 115: 241 Code{8, 5} 242 case 116: 243 Code{9, 5} 244 case 117: 245 Code{45, 6} 246 case 118: 247 Code{119, 7} 248 case 119: 249 Code{120, 7} 250 case 120: 251 Code{121, 7} 252 case 121: 253 Code{122, 7} 254 case 122: 255 Code{123, 7} 256 case 123: 257 Code{32766, 15} 258 case 124: 259 Code{2044, 11} 260 case 125: 261 Code{16381, 14} 262 case 126: 263 Code{8189, 13} 264 case 127: 265 Code{268435452, 28} 266 case 128: 267 Code{1048550, 20} 268 case 129: 269 Code{4194258, 22} 270 case 130: 271 Code{1048551, 20} 272 case 131: 273 Code{1048552, 20} 274 case 132: 275 Code{4194259, 22} 276 case 133: 277 Code{4194260, 22} 278 case 134: 279 Code{4194261, 22} 280 case 135: 281 Code{8388569, 23} 282 case 136: 283 Code{4194262, 22} 284 case 137: 285 Code{8388570, 23} 286 case 138: 287 Code{8388571, 23} 288 case 139: 289 Code{8388572, 23} 290 case 140: 291 Code{8388573, 23} 292 case 141: 293 Code{8388574, 23} 294 case 142: 295 Code{16777195, 24} 296 case 143: 297 Code{8388575, 23} 298 case 144: 299 Code{16777196, 24} 300 case 145: 301 Code{16777197, 24} 302 case 146: 303 Code{4194263, 22} 304 case 147: 305 Code{8388576, 23} 306 case 148: 307 Code{16777198, 24} 308 case 149: 309 Code{8388577, 23} 310 case 150: 311 Code{8388578, 23} 312 case 151: 313 Code{8388579, 23} 314 case 152: 315 Code{8388580, 23} 316 case 153: 317 Code{2097116, 21} 318 case 154: 319 Code{4194264, 22} 320 case 155: 321 Code{8388581, 23} 322 case 156: 323 Code{4194265, 22} 324 case 157: 325 Code{8388582, 23} 326 case 158: 327 Code{8388583, 23} 328 case 159: 329 Code{16777199, 24} 330 case 160: 331 Code{4194266, 22} 332 case 161: 333 Code{2097117, 21} 334 case 162: 335 Code{1048553, 20} 336 case 163: 337 Code{4194267, 22} 338 case 164: 339 Code{4194268, 22} 340 case 165: 341 Code{8388584, 23} 342 case 166: 343 Code{8388585, 23} 344 case 167: 345 Code{2097118, 21} 346 case 168: 347 Code{8388586, 23} 348 case 169: 349 Code{4194269, 22} 350 case 170: 351 Code{4194270, 22} 352 case 171: 353 Code{16777200, 24} 354 case 172: 355 Code{2097119, 21} 356 case 173: 357 Code{4194271, 22} 358 case 174: 359 Code{8388587, 23} 360 case 175: 361 Code{8388588, 23} 362 case 176: 363 Code{2097120, 21} 364 case 177: 365 Code{2097121, 21} 366 case 178: 367 Code{4194272, 22} 368 case 179: 369 Code{2097122, 21} 370 case 180: 371 Code{8388589, 23} 372 case 181: 373 Code{4194273, 22} 374 case 182: 375 Code{8388590, 23} 376 case 183: 377 Code{8388591, 23} 378 case 184: 379 Code{1048554, 20} 380 case 185: 381 Code{4194274, 22} 382 case 186: 383 Code{4194275, 22} 384 case 187: 385 Code{4194276, 22} 386 case 188: 387 Code{8388592, 23} 388 case 189: 389 Code{4194277, 22} 390 case 190: 391 Code{4194278, 22} 392 case 191: 393 Code{8388593, 23} 394 case 192: 395 Code{67108832, 26} 396 case 193: 397 Code{67108833, 26} 398 case 194: 399 Code{1048555, 20} 400 case 195: 401 Code{524273, 19} 402 case 196: 403 Code{4194279, 22} 404 case 197: 405 Code{8388594, 23} 406 case 198: 407 Code{4194280, 22} 408 case 199: 409 Code{33554412, 25} 410 case 200: 411 Code{67108834, 26} 412 case 201: 413 Code{67108835, 26} 414 case 202: 415 Code{67108836, 26} 416 case 203: 417 Code{134217694, 27} 418 case 204: 419 Code{134217695, 27} 420 case 205: 421 Code{67108837, 26} 422 case 206: 423 Code{16777201, 24} 424 case 207: 425 Code{33554413, 25} 426 case 208: 427 Code{524274, 19} 428 case 209: 429 Code{2097123, 21} 430 case 210: 431 Code{67108838, 26} 432 case 211: 433 Code{134217696, 27} 434 case 212: 435 Code{134217697, 27} 436 case 213: 437 Code{67108839, 26} 438 case 214: 439 Code{134217698, 27} 440 case 215: 441 Code{16777202, 24} 442 case 216: 443 Code{2097124, 21} 444 case 217: 445 Code{2097125, 21} 446 case 218: 447 Code{67108840, 26} 448 case 219: 449 Code{67108841, 26} 450 case 220: 451 Code{268435453, 28} 452 case 221: 453 Code{134217699, 27} 454 case 222: 455 Code{134217700, 27} 456 case 223: 457 Code{134217701, 27} 458 case 224: 459 Code{1048556, 20} 460 case 225: 461 Code{16777203, 24} 462 case 226: 463 Code{1048557, 20} 464 case 227: 465 Code{2097126, 21} 466 case 228: 467 Code{4194281, 22} 468 case 229: 469 Code{2097127, 21} 470 case 230: 471 Code{2097128, 21} 472 case 231: 473 Code{8388595, 23} 474 case 232: 475 Code{4194282, 22} 476 case 233: 477 Code{4194283, 22} 478 case 234: 479 Code{33554414, 25} 480 case 235: 481 Code{33554415, 25} 482 case 236: 483 Code{16777204, 24} 484 case 237: 485 Code{16777205, 24} 486 case 238: 487 Code{67108842, 26} 488 case 239: 489 Code{8388596, 23} 490 case 240: 491 Code{67108843, 26} 492 case 241: 493 Code{134217702, 27} 494 case 242: 495 Code{67108844, 26} 496 case 243: 497 Code{67108845, 26} 498 case 244: 499 Code{134217703, 27} 500 case 245: 501 Code{134217704, 27} 502 case 246: 503 Code{134217705, 27} 504 case 247: 505 Code{134217706, 27} 506 case 248: 507 Code{134217707, 27} 508 case 249: 509 Code{268435454, 28} 510 case 250: 511 Code{134217708, 27} 512 case 251: 513 Code{134217709, 27} 514 case 252: 515 Code{134217710, 27} 516 case 253: 517 Code{134217711, 27} 518 case 254: 519 Code{134217712, 27} 520 case 255: 521 Code{67108846, 26} 522 case 256: 523 Code{1073741823, 30} 524 case _: 525 Code{0, 0} 526 527 def width.of(c: Code) -> U32: 528 match c: 529 case Code{bits, width}: 530 width 531 532 def width(+octet: U32) -> U32: 533 width.of(code(octet)) 534 535 def symbol(+width: U32, +bits: U32) -> Maybe<&2, U32>: 536 match width: 537 case 5: 538 match bits: 539 case 0: 540 Some{48} 541 case 1: 542 Some{49} 543 case 2: 544 Some{50} 545 case 3: 546 Some{97} 547 case 4: 548 Some{99} 549 case 5: 550 Some{101} 551 case 6: 552 Some{105} 553 case 7: 554 Some{111} 555 case 8: 556 Some{115} 557 case 9: 558 Some{116} 559 case _: 560 None{} 561 case 6: 562 match bits: 563 case 20: 564 Some{32} 565 case 21: 566 Some{37} 567 case 22: 568 Some{45} 569 case 23: 570 Some{46} 571 case 24: 572 Some{47} 573 case 25: 574 Some{51} 575 case 26: 576 Some{52} 577 case 27: 578 Some{53} 579 case 28: 580 Some{54} 581 case 29: 582 Some{55} 583 case 30: 584 Some{56} 585 case 31: 586 Some{57} 587 case 32: 588 Some{61} 589 case 33: 590 Some{65} 591 case 34: 592 Some{95} 593 case 35: 594 Some{98} 595 case 36: 596 Some{100} 597 case 37: 598 Some{102} 599 case 38: 600 Some{103} 601 case 39: 602 Some{104} 603 case 40: 604 Some{108} 605 case 41: 606 Some{109} 607 case 42: 608 Some{110} 609 case 43: 610 Some{112} 611 case 44: 612 Some{114} 613 case 45: 614 Some{117} 615 case _: 616 None{} 617 case 7: 618 match bits: 619 case 92: 620 Some{58} 621 case 93: 622 Some{66} 623 case 94: 624 Some{67} 625 case 95: 626 Some{68} 627 case 96: 628 Some{69} 629 case 97: 630 Some{70} 631 case 98: 632 Some{71} 633 case 99: 634 Some{72} 635 case 100: 636 Some{73} 637 case 101: 638 Some{74} 639 case 102: 640 Some{75} 641 case 103: 642 Some{76} 643 case 104: 644 Some{77} 645 case 105: 646 Some{78} 647 case 106: 648 Some{79} 649 case 107: 650 Some{80} 651 case 108: 652 Some{81} 653 case 109: 654 Some{82} 655 case 110: 656 Some{83} 657 case 111: 658 Some{84} 659 case 112: 660 Some{85} 661 case 113: 662 Some{86} 663 case 114: 664 Some{87} 665 case 115: 666 Some{89} 667 case 116: 668 Some{106} 669 case 117: 670 Some{107} 671 case 118: 672 Some{113} 673 case 119: 674 Some{118} 675 case 120: 676 Some{119} 677 case 121: 678 Some{120} 679 case 122: 680 Some{121} 681 case 123: 682 Some{122} 683 case _: 684 None{} 685 case 8: 686 match bits: 687 case 248: 688 Some{38} 689 case 249: 690 Some{42} 691 case 250: 692 Some{44} 693 case 251: 694 Some{59} 695 case 252: 696 Some{88} 697 case 253: 698 Some{90} 699 case _: 700 None{} 701 case 10: 702 match bits: 703 case 1016: 704 Some{33} 705 case 1017: 706 Some{34} 707 case 1018: 708 Some{40} 709 case 1019: 710 Some{41} 711 case 1020: 712 Some{63} 713 case _: 714 None{} 715 case 11: 716 match bits: 717 case 2042: 718 Some{39} 719 case 2043: 720 Some{43} 721 case 2044: 722 Some{124} 723 case _: 724 None{} 725 case 12: 726 match bits: 727 case 4090: 728 Some{35} 729 case 4091: 730 Some{62} 731 case _: 732 None{} 733 case 13: 734 match bits: 735 case 8184: 736 Some{0} 737 case 8185: 738 Some{36} 739 case 8186: 740 Some{64} 741 case 8187: 742 Some{91} 743 case 8188: 744 Some{93} 745 case 8189: 746 Some{126} 747 case _: 748 None{} 749 case 14: 750 match bits: 751 case 16380: 752 Some{94} 753 case 16381: 754 Some{125} 755 case _: 756 None{} 757 case 15: 758 match bits: 759 case 32764: 760 Some{60} 761 case 32765: 762 Some{96} 763 case 32766: 764 Some{123} 765 case _: 766 None{} 767 case 19: 768 match bits: 769 case 524272: 770 Some{92} 771 case 524273: 772 Some{195} 773 case 524274: 774 Some{208} 775 case _: 776 None{} 777 case 20: 778 match bits: 779 case 1048550: 780 Some{128} 781 case 1048551: 782 Some{130} 783 case 1048552: 784 Some{131} 785 case 1048553: 786 Some{162} 787 case 1048554: 788 Some{184} 789 case 1048555: 790 Some{194} 791 case 1048556: 792 Some{224} 793 case 1048557: 794 Some{226} 795 case _: 796 None{} 797 case 21: 798 match bits: 799 case 2097116: 800 Some{153} 801 case 2097117: 802 Some{161} 803 case 2097118: 804 Some{167} 805 case 2097119: 806 Some{172} 807 case 2097120: 808 Some{176} 809 case 2097121: 810 Some{177} 811 case 2097122: 812 Some{179} 813 case 2097123: 814 Some{209} 815 case 2097124: 816 Some{216} 817 case 2097125: 818 Some{217} 819 case 2097126: 820 Some{227} 821 case 2097127: 822 Some{229} 823 case 2097128: 824 Some{230} 825 case _: 826 None{} 827 case 22: 828 match bits: 829 case 4194258: 830 Some{129} 831 case 4194259: 832 Some{132} 833 case 4194260: 834 Some{133} 835 case 4194261: 836 Some{134} 837 case 4194262: 838 Some{136} 839 case 4194263: 840 Some{146} 841 case 4194264: 842 Some{154} 843 case 4194265: 844 Some{156} 845 case 4194266: 846 Some{160} 847 case 4194267: 848 Some{163} 849 case 4194268: 850 Some{164} 851 case 4194269: 852 Some{169} 853 case 4194270: 854 Some{170} 855 case 4194271: 856 Some{173} 857 case 4194272: 858 Some{178} 859 case 4194273: 860 Some{181} 861 case 4194274: 862 Some{185} 863 case 4194275: 864 Some{186} 865 case 4194276: 866 Some{187} 867 case 4194277: 868 Some{189} 869 case 4194278: 870 Some{190} 871 case 4194279: 872 Some{196} 873 case 4194280: 874 Some{198} 875 case 4194281: 876 Some{228} 877 case 4194282: 878 Some{232} 879 case 4194283: 880 Some{233} 881 case _: 882 None{} 883 case 23: 884 match bits: 885 case 8388568: 886 Some{1} 887 case 8388569: 888 Some{135} 889 case 8388570: 890 Some{137} 891 case 8388571: 892 Some{138} 893 case 8388572: 894 Some{139} 895 case 8388573: 896 Some{140} 897 case 8388574: 898 Some{141} 899 case 8388575: 900 Some{143} 901 case 8388576: 902 Some{147} 903 case 8388577: 904 Some{149} 905 case 8388578: 906 Some{150} 907 case 8388579: 908 Some{151} 909 case 8388580: 910 Some{152} 911 case 8388581: 912 Some{155} 913 case 8388582: 914 Some{157} 915 case 8388583: 916 Some{158} 917 case 8388584: 918 Some{165} 919 case 8388585: 920 Some{166} 921 case 8388586: 922 Some{168} 923 case 8388587: 924 Some{174} 925 case 8388588: 926 Some{175} 927 case 8388589: 928 Some{180} 929 case 8388590: 930 Some{182} 931 case 8388591: 932 Some{183} 933 case 8388592: 934 Some{188} 935 case 8388593: 936 Some{191} 937 case 8388594: 938 Some{197} 939 case 8388595: 940 Some{231} 941 case 8388596: 942 Some{239} 943 case _: 944 None{} 945 case 24: 946 match bits: 947 case 16777194: 948 Some{9} 949 case 16777195: 950 Some{142} 951 case 16777196: 952 Some{144} 953 case 16777197: 954 Some{145} 955 case 16777198: 956 Some{148} 957 case 16777199: 958 Some{159} 959 case 16777200: 960 Some{171} 961 case 16777201: 962 Some{206} 963 case 16777202: 964 Some{215} 965 case 16777203: 966 Some{225} 967 case 16777204: 968 Some{236} 969 case 16777205: 970 Some{237} 971 case _: 972 None{} 973 case 25: 974 match bits: 975 case 33554412: 976 Some{199} 977 case 33554413: 978 Some{207} 979 case 33554414: 980 Some{234} 981 case 33554415: 982 Some{235} 983 case _: 984 None{} 985 case 26: 986 match bits: 987 case 67108832: 988 Some{192} 989 case 67108833: 990 Some{193} 991 case 67108834: 992 Some{200} 993 case 67108835: 994 Some{201} 995 case 67108836: 996 Some{202} 997 case 67108837: 998 Some{205} 999 case 67108838: 1000 Some{210} 1001 case 67108839: 1002 Some{213} 1003 case 67108840: 1004 Some{218} 1005 case 67108841: 1006 Some{219} 1007 case 67108842: 1008 Some{238} 1009 case 67108843: 1010 Some{240} 1011 case 67108844: 1012 Some{242} 1013 case 67108845: 1014 Some{243} 1015 case 67108846: 1016 Some{255} 1017 case _: 1018 None{} 1019 case 27: 1020 match bits: 1021 case 134217694: 1022 Some{203} 1023 case 134217695: 1024 Some{204} 1025 case 134217696: 1026 Some{211} 1027 case 134217697: 1028 Some{212} 1029 case 134217698: 1030 Some{214} 1031 case 134217699: 1032 Some{221} 1033 case 134217700: 1034 Some{222} 1035 case 134217701: 1036 Some{223} 1037 case 134217702: 1038 Some{241} 1039 case 134217703: 1040 Some{244} 1041 case 134217704: 1042 Some{245} 1043 case 134217705: 1044 Some{246} 1045 case 134217706: 1046 Some{247} 1047 case 134217707: 1048 Some{248} 1049 case 134217708: 1050 Some{250} 1051 case 134217709: 1052 Some{251} 1053 case 134217710: 1054 Some{252} 1055 case 134217711: 1056 Some{253} 1057 case 134217712: 1058 Some{254} 1059 case _: 1060 None{} 1061 case 28: 1062 match bits: 1063 case 268435426: 1064 Some{2} 1065 case 268435427: 1066 Some{3} 1067 case 268435428: 1068 Some{4} 1069 case 268435429: 1070 Some{5} 1071 case 268435430: 1072 Some{6} 1073 case 268435431: 1074 Some{7} 1075 case 268435432: 1076 Some{8} 1077 case 268435433: 1078 Some{11} 1079 case 268435434: 1080 Some{12} 1081 case 268435435: 1082 Some{14} 1083 case 268435436: 1084 Some{15} 1085 case 268435437: 1086 Some{16} 1087 case 268435438: 1088 Some{17} 1089 case 268435439: 1090 Some{18} 1091 case 268435440: 1092 Some{19} 1093 case 268435441: 1094 Some{20} 1095 case 268435442: 1096 Some{21} 1097 case 268435443: 1098 Some{23} 1099 case 268435444: 1100 Some{24} 1101 case 268435445: 1102 Some{25} 1103 case 268435446: 1104 Some{26} 1105 case 268435447: 1106 Some{27} 1107 case 268435448: 1108 Some{28} 1109 case 268435449: 1110 Some{29} 1111 case 268435450: 1112 Some{30} 1113 case 268435451: 1114 Some{31} 1115 case 268435452: 1116 Some{127} 1117 case 268435453: 1118 Some{220} 1119 case 268435454: 1120 Some{249} 1121 case _: 1122 None{} 1123 case 30: 1124 match bits: 1125 case 1073741820: 1126 Some{10} 1127 case 1073741821: 1128 Some{13} 1129 case 1073741822: 1130 Some{22} 1131 case 1073741823: 1132 Some{256} 1133 case _: 1134 None{} 1135 case _: 1136 None{} 1137 1138 def size.valid(ok: Bool, +total: U32, +n: U32) -> Maybe<&2, U32>: 1139 match ok: 1140 case True{}: 1141 Some{(total + n : U32)} 1142 case False{}: 1143 None{} 1144 def size.one(+octet: U32, +total: U32) -> Maybe<&2, U32>: 1145 +n = width(octet) 1146 size.valid(Bool.and(U32.is_ne(n, 0), U32.is_le(total, (4294967295 - n : U32))), total, n) 1147 1148 1149 def size(s: String, +total: U32) -> Maybe<&2, U32>: 1150 match s: 1151 case SNil{}: 1152 Some{total} 1153 case SCon{Chr{c}, t}: 1154 do Maybe<&2, U32>: 1155 n: U32 <- size.one(c, total) 1156 size(t, n) 1157 1158 type Builder is Type: 1159 Builder{bytes: Bytes.Bytes, at: U32, partial: U32, bits: U32} 1160 1161 def emit.full(full: Bool, out: Bytes.Bytes, +at: U32, +partial: U32, +bits: U32) -> Builder: 1162 match full: 1163 case True{}: 1164 Builder{Bytes.set(out, at, partial), (at + 1 : U32), 0, 0} 1165 case False{}: 1166 Builder{out, at, partial, (bits + 1 : U32)} 1167 1168 def emit.bit(+bit: U32, st: Builder) -> Builder: 1169 Builder{out, +at, +partial, +bits} = st 1170 emit.full(U32.is_eq(bits, 7), out, at, ((partial << 1n) .|. bit : U32), bits) 1171 1172 def emit.bits(n: Nat, +code: U32, st: Builder) -> Builder: 1173 match n: 1174 case 0n: 1175 st 1176 case 1n+p: 1177 +p = p 1178 emit.bits(p, code, emit.bit(((code >> p) .&. 1 : U32), st)) 1179 1180 def emit.code(c: Code, st: Builder) -> Builder: 1181 match c: 1182 case Code{bits, width}: 1183 emit.bits(U32.to_nat(width), bits, st) 1184 1185 def encode.go(s: String, st: Builder) -> Builder: 1186 match s: 1187 case SNil{}: 1188 st 1189 case SCon{Chr{c}, t}: 1190 encode.go(t, emit.code(code(c), st)) 1191 1192 def encode.last(more: Bool, out: Bytes.Bytes, +at: U32, +partial: U32, +bits: U32) -> Bytes.Bytes: 1193 match more: 1194 case False{}: 1195 out 1196 case True{}: 1197 +pad = (8 - bits : U32) 1198 Bytes.set(out, at, ((partial << U32.to_nat(pad)) .|. ((1 << U32.to_nat(pad)) - 1 : U32) : U32)) 1199 def encode.finish(st: Builder) -> Bytes.Bytes: 1200 Builder{out, +at, +partial, +bits} = st 1201 encode.last(U32.is_ne(bits, 0), out, at, partial, bits) 1202 1203 1204 def encode.ready(s: String, m: Maybe<&2, U32>) -> Maybe<&1, Bytes.Bytes>: 1205 match m: 1206 case None{}: 1207 None{} 1208 case Some{+bits}: 1209 +len = ((bits >> 3n) + Bool.pick(U32, U32.is_ne((bits .&. 7 : U32), 0), 1, 0) : U32) 1210 Some{encode.finish(encode.go(s, Builder{Bytes.new(len), 0, 0, 0}))} 1211 1212 # HPACK text is a byte string: code points above 255 are rejected. 1213 def encode(+s: String) -> Maybe<&1, Bytes.Bytes>: 1214 encode.ready(s, size(s, 0)) 1215 1216 type Decoder is Data: 1217 Decoder{bits: U32, width: U32, rev: String} 1218 1219 def decode.found(+octet: U32, rev: String) -> Maybe<&2, Decoder>: 1220 match octet: 1221 case 256: 1222 None{} 1223 case _: 1224 Some{Decoder{0, 0, SCon{Chr{octet}, rev}}} 1225 1226 def decode.pending(ok: Bool, +bits: U32, +width: U32, rev: String) -> Maybe<&2, Decoder>: 1227 match ok: 1228 case True{}: 1229 Some{Decoder{bits, width, rev}} 1230 case False{}: 1231 None{} 1232 def decode.symbol(m: Maybe<&2, U32>, +bits: U32, +width: U32, rev: String) -> Maybe<&2, Decoder>: 1233 match m: 1234 case Some{octet}: 1235 decode.found(octet, rev) 1236 case None{}: 1237 decode.pending(U32.is_lt(width, 30), bits, width, rev) 1238 1239 1240 def decode.bit(d: Decoder, +bit: U32) -> Maybe<&2, Decoder>: 1241 Decoder{+bits, +width, rev} = d 1242 +code = ((bits << 1n) .|. bit : U32) 1243 +n = (width + 1 : U32) 1244 decode.symbol(symbol(n, code), code, n, rev) 1245 1246 def decode.step(n: Nat, +byte: U32, d: Decoder) -> Maybe<&2, Decoder>: 1247 match n: 1248 case 0n: 1249 Some{d} 1250 case 1n+p: 1251 +p = p 1252 do Maybe<&2, Decoder>: 1253 next: Decoder <- decode.bit(d, ((byte >> p) .&. 1 : U32)) 1254 decode.step(p, byte, next) 1255 1256 def with_number.got(-R: Type, m: Maybe<&2, U32>, b: Bytes.Bytes, k: Bytes.Bytes -> U32 -> R) -> R: 1257 match m: 1258 case Some{v}: 1259 k(b, v) 1260 case None{}: 1261 k(b, 0) 1262 def with_number(-R: Type, r: Bytes.Bytes & Maybe<&2, U32>, k: Bytes.Bytes -> U32 -> R) -> R: 1263 (b, m) = r 1264 with_number.got(R, m, b, k) 1265 1266 1267 def decode.go(n: Nat, b: Bytes.Bytes, +at: U32, d: Decoder) -> Maybe<&2, Decoder>: 1268 match n: 1269 case 0n: 1270 Some{d} 1271 case 1n+p: 1272 with_number(Maybe<&2, Decoder>, Bytes.get(b, at), b => byte => 1273 do Maybe<&2, Decoder>: 1274 next: Decoder <- decode.step(8n, byte, d) 1275 decode.go(p, b, (at + 1 : U32), next)) 1276 1277 def decode.tail(ok: Bool, rev: String) -> Maybe<&2, String>: 1278 match ok: 1279 case True{}: 1280 Some{String.reverse(rev)} 1281 case False{}: 1282 None{} 1283 1284 def decode.finish(m: Maybe<&2, Decoder>) -> Maybe<&2, String>: 1285 match m: 1286 case None{}: 1287 None{} 1288 case Some{Decoder{+bits, +width, rev}}: 1289 decode.tail(Bool.and(U32.is_le(width, 7), U32.is_eq(bits, ((1 << U32.to_nat(width)) - 1 : U32))), rev) 1290 1291 def decode(b: Bytes.Bytes) -> Maybe<&2, String>: 1292 Bytes.Bytes{+len, buf} = b 1293 decode.finish(decode.go(U32.to_nat(len), Bytes.Bytes{len, buf}, 0, Decoder{0, 0, SNil{}}))