parvel / typeinfo.mli

The default branch has multiple heads

(* цель: сделать интерфейс для обмена значениями, позволяющий:
    - в пределах программы -- просто передавать значения из
      одного места в коде в другое, так, чтобы "значение-ящик"
      имело один фиксированный тип, а "значение-свидетель" было
      параметризовано нужным типом, чтобы эти типы выводились
      сами по себе, как па валшэбству
    - в пределах программы -- "всовывать" полу-типизированные
      значения из json и других форматов сериализации, с расчётом
      на то, что они могут и не соответствовать типу (в этом
      случае -- не падать, но кидать ошибку)
    - за пределами программы -- использовать [де]сериализацию
      (JSON и другие разумные/нужные форматы типа XML,
      s-выражений, YAML) для передачи значений
      из одного процесса в другой, возможно по
      сети
*)




(* "информация о типе"
   параметризовано типом *)
type ttypeinfo 'a;


(* "информация о типе"
   фиксированного типа
   стрелки "от" пока не нарисованы,
   стрелки "к" -- проекции [ttypeinfo 'a] *)
type utypeinfo;


(* значение в ящике
   параметризовано типом *)
type tbox 'a;


(* значение в ящике
   фиксированного типа *)
type ubox;


(* засовываем значение в типизированный ящик
   требуется "информация о типе" *)
value tput : ttypeinfo 'a -> 'a -> tbox 'a;


(* берём значение из типизированного ящика
   тривиально *)
value tget : tbox 'a -> 'a;


(* стираем тип ящика
   тривиально *)
value ubox : tbox 'a -> ubox;

(* arguments: (expected, got) *)
exception Type_error of string and string;

(* добавляем тип ящику
   требуется "информация о типе"
   может обломаться, бросая исключение
*)
value tbox_exn : ttypeinfo 'a -> ubox -> tbox 'a;

(* взять значение из ящика
   требуется "информация о типе"
   может обломаться, бросая исключение
*)
value uget_exn : ttypeinfo 'a -> ubox -> 'a;

(* взять значение из ящика в IO-монаде
   требуется "информация о типе"
   может обломаться с ошибкой IO-монады
*)
value uget_io : ttypeinfo 'a -> ubox -> Parvel_IO.m 'a;


(*****************************************************)


(* [make_typeinfo "имятипа"] создаёт "информацию о типе".
   имя типа должно быть уникально в пределах программы
   (при необходимости используйте иерархию) *)
value make_typeinfo : string -> ttypeinfo 'a;

(* взять нетипизированную "информацию о типе" из типизированной: *)
value utypeinfo : ttypeinfo 'a -> utypeinfo;


(* добавление [де]сериализаций будет осуществляться
   функциями, изменяющими {t,u}typeinfo (добавляющими
   способы [де]сериализации).  Например, в
   "фиксированный тип", как в случае json, слегка ниже. *)


(* добавить к "информации о типе" сериализацию в/из json.
   Ошибки десериализации, кинутые в виде исключений
   функцией "из json в 'a", должны обрабатываться как
   "не шмогла", как и для других случаев (например, как
   для неправильно-подсунутой [ttypeinfo 'a] при
   преобраовании [ubox] в [tbox 'b]). *)


value ti_json :
  ttypeinfo 'a ->
  ('a -> Json_type.t) ->
  (Json_type.t -> 'a) ->
  unit;


(* засунуть json согласно данного [utypeinfo] в [ubox]: *)
value uput_json : utypeinfo -> Json_type.t -> ubox;


(* взять json из данного [tbox 'a]: *)
value tget_json : tbox 'a -> Json_type.t;


(* взять имя типа из данного [tbox 'a]: *)
value tbox_type_name : tbox 'a -> string;


(* взять имя типа из данного [ubox]: *)
value ubox_type_name : ubox -> string;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.