mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
188 lines
4.2 KiB
Plaintext
188 lines
4.2 KiB
Plaintext
(***********************************************************************)
|
|
(* *)
|
|
(* 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: hwxi AT cs DOT bu DOT edu *)
|
|
(* Start time: December, 2012 *)
|
|
|
|
(* ****** ****** *)
|
|
//
|
|
// HX: shared by linset_listord (* ordered list *)
|
|
// HX: shared by linset_avltree (* AVL-tree-based *)
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
// HX-2013-02:
|
|
// for sets of nonlinear elements
|
|
//
|
|
absvtype set_vtype (a:t@ype+) = ptr
|
|
//
|
|
(* ****** ****** *)
|
|
|
|
vtypedef set (a:t0p) = set_vtype (a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
compare_elt_elt (x1: a, x2: a):<> int
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{} linset_nil{a:t0p} ():<> set(a)
|
|
fun{} linset_make_nil{a:t0p} ():<> set(a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p} linset_sing (x: a):<!wrt> set(a)
|
|
fun{a:t0p} linset_make_sing (x: a):<!wrt> set(a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_make_list (xs: List(INV(a))):<!wrt> set(a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{}
|
|
linset_is_nil {a:t0p} (xs: !set(INV(a))):<> bool
|
|
fun{}
|
|
linset_isnot_nil {a:t0p} (xs: !set(INV(a))):<> bool
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p} linset_size (!set(INV(a))): size_t
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_is_member (xs: !set(INV(a)), x0: a):<> bool
|
|
fun{a:t0p}
|
|
linset_isnot_member (xs: !set(INV(a)), x0: a):<> bool
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_copy (!set(INV(a))):<!wrt> set(a)
|
|
fun{a:t0p}
|
|
linset_free (xs: set(INV(a))):<!wrt> void
|
|
|
|
(* ****** ****** *)
|
|
//
|
|
fun{a:t0p}
|
|
linset_insert
|
|
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
fun{a:t0p}
|
|
linset_takeout
|
|
(
|
|
&set(INV(a)) >> _, a, res: &(a?) >> opt(a, b)
|
|
) :<!wrt> #[b:bool] bool(b) // endfun
|
|
fun{a:t0p}
|
|
linset_takeout_opt (&set(INV(a)) >> _, a):<!wrt> Option_vt(a)
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
fun{a:t0p}
|
|
linset_remove
|
|
(xs: &set(INV(a)) >> _, x0: a):<!wrt> bool
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
// HX: choosing an element in an unspecified manner
|
|
//
|
|
fun{a:t0p}
|
|
linset_choose
|
|
(
|
|
xs: !set(INV(a)), x: &a? >> opt (a, b)
|
|
) :<!wrt> #[b:bool] bool(b)
|
|
//
|
|
fun{a:t0p}
|
|
linset_choose_opt (xs: !set(INV(a))):<!wrt> Option_vt(a)
|
|
//
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_takeoutmax
|
|
(
|
|
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
|
|
) :<!wrt> #[b:bool] bool (b)
|
|
fun{a:t0p}
|
|
linset_takeoutmax_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_takeoutmin
|
|
(
|
|
xs: &set(INV(a)) >> _, res: &a? >> opt(a, b)
|
|
) :<!wrt> #[b:bool] bool (b)
|
|
fun{a:t0p}
|
|
linset_takeoutmin_opt (xs: &set(INV(a)) >> _):<!wrt> Option_vt(a)
|
|
|
|
(* ****** ****** *)
|
|
//
|
|
fun{}
|
|
fprint_linset$sep (FILEref): void // ", "
|
|
//
|
|
fun{a:t0p}
|
|
fprint_linset (out: FILEref, xs: !set(INV(a))): void
|
|
//
|
|
overload fprint with fprint_linset
|
|
//
|
|
(* ****** ****** *)
|
|
//
|
|
fun{
|
|
a:t0p}{env:vt0p
|
|
} linset_foreach$fwork
|
|
(x: a, env: &(env) >> _): void
|
|
//
|
|
fun{a:t0p}
|
|
linset_foreach (set: !set(INV(a))): void
|
|
fun{
|
|
a:t0p}{env:vt0p
|
|
} linset_foreach_env
|
|
(set: !set(INV(a)), env: &(env) >> _): void
|
|
// end of [linset_foreach_env]
|
|
//
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_listize (xs: set(INV(a))): List0_vt (a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
fun{a:t0p}
|
|
linset_listize1 (xs: !set(INV(a))): List0_vt (a)
|
|
|
|
(* ****** ****** *)
|
|
|
|
(* end of [linset.hats] *)
|