unbound-0.2: Unbound/LocallyNameless.hs
----------------------------------------------------------------------
-- |
-- Module : Unbound.LocallyNameless
-- License : BSD-like (see LICENSE)
--
-- Maintainer : Stephanie Weirich <sweirich@cis.upenn.edu>
-- Stability : experimental
-- Portability : non-portable (-XKitchenSink)
--
-- A generic implementation of name binding functions using a locally
-- nameless representation. Datatypes with binding can be defined
-- using the 'Name' and 'Bind' types. Expressive patterns for binding
-- come from the 'Embed' and 'Rebind' types.
--
-- Important classes are:
--
-- * 'Alpha' -- the class of types and patterns that include binders,
--
-- * 'Subst' -- for subtitution functions.
--
-- Name generation is controlled via monads which implement the
-- 'Fresh' and 'LFresh' classes.
----------------------------------------------------------------------
module Unbound.LocallyNameless
( -- * Basic types
Name, AnyName(..), Bind, Embed(..), Rebind, Rec, TRec, Shift(..),
-- ** Utilities
integer2Name, string2Name, s2n, makeName,
name2Integer, name2String, anyName2Integer, anyName2String,
name1,name2,name3,name4,name5,name6,name7,name8,name9,name10,
translate,
-- * The 'Alpha' class
Alpha(..),
swaps, swapsEmbeds, swapsBinders,
aeq, aeqBinders,
acompare,
-- * Variable calculations
Collection(..), Multiset(..),
fv, fvAny, patfv, patfvAny, binders, bindersAny,
-- * Binding operations
bind, unsafeUnbind,
-- * The 'Fresh' class
Fresh(..), freshen,
unbind, unbind2, unbind3,
FreshM, runFreshM,
FreshMT, runFreshMT,
-- * The 'LFresh' class
LFresh(..),
lfreshen,
lunbind, lunbind2, lunbind3,
LFreshM, runLFreshM, getAvoids,
LFreshMT, runLFreshMT,
-- * Rebinding operations
rebind, unrebind,
-- * Rec operations
rec, unrec,
trec, untrec, luntrec,
-- XXX export embed, unembed, shift, unshift.
-- XXX should embed/unembed work for Shifts as well?
-- * Substitution
Subst(..), SubstName(..),
-- * Pay no attention to the man behind the curtain
-- $paynoattention
rName, rBind, rRebind, rEmbed, rRec, rShift
) where
import Unbound.LocallyNameless.Name
import Unbound.LocallyNameless.Fresh
import Unbound.LocallyNameless.Types
import Unbound.LocallyNameless.Alpha
import Unbound.LocallyNameless.Subst
import Unbound.LocallyNameless.Ops
import Unbound.Util
-- $paynoattention
-- These type representation objects are exported so they can be
-- referenced by auto-generated code. Please pretend they do not
-- exist.