(***********************************************************************)
(*                                                                     *)
(*                         Applied Type System                         *)
(*                                                                     *)
(***********************************************************************)

(*
** ATS/Postiats - Unleashing the Potential of Types!
** Copyright (C) 2011-2013 Hongwei Xi, ATS Trustful Software, Inc.
** All rights reserved
**
** ATS is free software;  you can  redistribute it and/or modify it under
** the terms of  the GNU GENERAL PUBLIC LICENSE (GPL) as published by the
** Free Software Foundation; either version 3, or (at  your  option)  any
** later version.
** 
** ATS is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without  even  the  implied  warranty  of MERCHANTABILITY or
** FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License
** for more details.
** 
** You  should  have  received  a  copy of the GNU General Public License
** along  with  ATS;  see the  file COPYING.  If not, please write to the
** Free Software Foundation,  51 Franklin Street, Fifth Floor, Boston, MA
** 02110-1301, USA.
*)

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

(* Author: Hongwei Xi *)
(* Authoremail:
   gmhwxiATgmailDOTcom *)
(* Starting time: December, 2015 *)

(* ****** ****** *)
//
#define
ATS_PACKNAME "ATSLIB.libats.ML"
//
#define
ATS_EXTERN_PREFIX "atslib_ML_" // prefix for external names
//
(* ****** ****** *)

staload "libats/ML/SATS/basis.sats"

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

(*
typedef SHR(a:type) = a // for commenting purpose
typedef NSH(a:type) = a // for commenting purpose
*)

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

macdef
GVint_uncons(x0) =
(
case+
,(x0)
of // case+
| GVint(i) => i
| _(*non-int*) =>
  let val () = assertloc(false) in exit(1) end
) : int // end of [GVint_uncons]

macdef
GVptr_uncons(x0) =
(
case+
,(x0)
of // case+
| GVptr(i) => i
| _(*non-ptr*) =>
  let val () = assertloc(false) in exit(1) end
) : ptr // end of [GVptr_uncons]

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

macdef
GVbool_uncons(x0) =
(
case+
,(x0)
of // case+
| GVbool(i) => i
| _(*non-bool*) =>
  let val () = assertloc(false) in exit(1) end
) : bool // end of [GVbool_uncons]

macdef
GVchar_uncons(x0) =
(
case+
,(x0)
of // case+
| GVchar(i) => i
| _(*non-char*) =>
  let val () = assertloc(false) in exit(1) end
) : char // end of [GVchar_uncons]

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

macdef
GVfloat_uncons(x0) =
(
case+
,(x0)
of // case+
| GVfloat(f) => f
| _(*non-float*) =>
  let val () = assertloc(false) in exit(1) end
) : double // end of [GVfloat_uncons]

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

macdef
GVstring_uncons(x0) =
(
case+
,(x0)
of // case+
| GVstring(s) => s
| _(*non-string*) =>
  let val () = assertloc(false) in exit(1) end
) : string // end of [GVstring_uncons]

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

macdef
GVlist_uncons(x0) =
(
case+
,(x0)
of // case+
| GVlist(xs) => xs
| _(*non-string*) =>
  let val () = assertloc(false) in exit(1) end
) : gvlist // end of [GVlist_uncons]

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

macdef
GVarray_uncons(x0) =
(
case+
,(x0)
of // case+
| GVarray(xs) => xs
| _(*non-string*) =>
  let val () = assertloc(false) in exit(1) end
) : gvarray // end of [GVarray_uncons]

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

macdef
GVhashtbl_uncons(x0) =
(
case+
,(x0)
of // case+
| GVhashtbl(kxs) => kxs
| _(*non-string*) =>
  let val () = assertloc(false) in exit(1) end
) : gvhashtbl // end of [GVhashtbl_uncons]

(* ****** ****** *)
//
fun
print_gvalue : gvalue -> void
fun
prerr_gvalue : gvalue -> void
fun
fprint_gvalue : fprint_type(gvalue)
//
overload print with print_gvalue
overload prerr with prerr_gvalue
overload fprint with fprint_gvalue
//
fun
fprint_gvlist : fprint_type(gvlist)
fun
fprint_gvarray : fprint_type(gvarray)
fun
fprint_gvdynarr : fprint_type(gvdynarr)
fun
fprint_gvhashtbl : fprint_type(gvhashtbl)
//
overload fprint with fprint_gvlist of 10
overload fprint with fprint_gvarray of 10
overload fprint with fprint_gvdynarr of 10
overload fprint with fprint_gvhashtbl of 20
//
(* ****** ****** *)
//
fun{}
gvalue_nil(): gvalue
//
fun{}
gvalue_int(int): gvalue
//
fun{}
gvalue_ptr(ptr): gvalue
//
fun{}
gvalue_bool(bool): gvalue
fun{}
gvalue_char(char): gvalue
//
fun{}
gvalue_float(double): gvalue
fun{}
gvalue_string(string): gvalue
//
(* ****** ****** *)
//
fun{}
gvalue_box{a:type}(x: a): gvalue
//
(* ****** ****** *)
//
fun{}
gvalue_ref(gvref): gvalue
//
fun{}
gvalue_list(xs: gvlist): gvalue
//
fun{}
gvalue_array(xs: gvarray): gvalue
//
fun{}
gvalue_hashtbl(kxs: gvhashtbl): gvalue
//
(* ****** ****** *)
//
fun{}
gvalue_is_nil(gvalue): bool
fun{}
gvalue_isnot_nil(gvalue): bool
//
overload iseqz with gvalue_is_nil
overload isneqz with gvalue_isnot_nil
//
(* ****** ****** *)
//
fun
gvref_make_elt(ini: gvalue): gvref
//
(* ****** ****** *)
//
fun
gvarray_make_nil(asz: intGte(0)): gvarray
//
(* ****** ****** *)
//
fun
gvdynarr_make_nil(cap: intGte(1)): gvdynarr
//
(* ****** ****** *)
//
fun
gvdynarr_get_at
  (gvdynarr, i: intGte(0)): gvalue
fun
gvdynarr_set_at
  (gvdynarr, i: intGte(0), x: gvalue): void
//
overload [] with gvdynarr_get_at
overload [] with gvdynarr_set_at
//
(* ****** ****** *)
//
fun
gvdynarr_insert_atbeg
  (gvdynarr, x: gvalue): void
fun
gvdynarr_insert_atend
  (gvdynarr, x: gvalue): void
//
overload .insbeg with gvdynarr_insert_atbeg
overload .insend with gvdynarr_insert_atend
//
(* ****** ****** *)
//
fun
gvdynarr_listize0(gvdynarr): list0(gvalue)
fun
gvdynarr_listize1(gvdynarr): list0(gvalue)
//
(* ****** ****** *)
//
fun
gvhashtbl_make_nil
  (cap: intGte(1)): gvhashtbl
//
(* ****** ****** *)
//
fun
gvhashtbl_get_atkey
  (gvhashtbl, k: string): gvalue
fun
gvhashtbl_set_atkey
  (gvhashtbl, k: string, x: gvalue): void
//
fun
gvhashtbl_exch_atkey
  (gvhashtbl, k: string, x: gvalue): gvalue
//
(* ****** ****** *)
//
overload [] with gvhashtbl_get_atkey of 20
overload [] with gvhashtbl_set_atkey of 20
//
(*
overload .get with gvhashtbl_get_atkey of 20
overload .set with gvhashtbl_set_atkey of 20
*)
//
(* ****** ****** *)
//
fun
gvhashtbl_pop_atkey
  (gvhashtbl, k: string): gvalue
fun
gvhashtbl_push_atkey
  (gvhashtbl, k: string, x: gvalue): void
//
(* ****** ****** *)
//
fun{}
gvhashtbl_foreach_cloref
(
  tbl: gvhashtbl
, fwork: (string, &gvalue >> _) -<cloref1> void
) : void // end of [gvhashtbl_foreach_cloref]
//
fun{}
gvhashtbl_foreach_method
(
  tbl: gvhashtbl
)
(
  fwork: (string, &gvalue >> _) -<cloref1> void
) : void // end of [gvhashtbl_foreach_method]
//
(* ****** ****** *)
//
fun{}
gvhashtbl_listize1(gvhashtbl): list0 @(string, gvalue)
//
(* ****** ****** *)

(* end of [gvalue.sats] *)