12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455openCoreincludeAlphabet.Make(structletcard=20end)letchars_of_aa_string="ACDEFGHIKLMNPQRSTVWY"let%test"chars_of_aa_string"=String.lengthchars_of_aa_string=cardletto_chari=chars_of_aa_string.[i]letyojson_of_vectorvec:Yojson.Safe.t=`Assoc(Vector.to_arrayvec|>Array.mapi~f:(funaax->to_charaa|>Char.to_string,`Floatx)|>Array.to_list)letvector_of_yojsonaa_list=(* Optimization to validate that all AA are present *)letaa_queue=Yojson.Safe.Util.to_assocaa_list|>List.sort~compare:(fun(x,_)(y,_)->String.comparexy)|>Queue.of_listinVector.init(funaa->letaa_char=to_charaainletis_expectedaa_str=Char.(aa_str|>of_string=aa_char)inmatchQueue.dequeueaa_queuewith|Some(key,x)whenis_expectedkey->Yojson.Safe.Util.to_numberx|Some(key,_)->failwithf"Expected value for %c ; found %s"aa_charkey()|None->failwithf"Missing AA : %c ; reached end of json record without finding it"aa_char())letcode_A=Char.to_int'A'letaa_of_chars=lett=Array.create~len:26Noneinfori=0toString.lengthchars_of_aa_string-1dot.(Char.to_intchars_of_aa_string.[i]-code_A)<-Someidone;tletof_char=function|'A'..'Z'asc->aa_of_chars.(Char.to_intc-code_A)|_->Noneletof_char_exnc=Option.value_exn(of_charc)let%test"of_char"=letopenPolyinof_char(to_char19)=Some19&&of_char'Z'=None