module Unbound.Generics.LocallyNameless.Extra where
import Control.DeepSeq
import Data.Hashable (Hashable(..),hash)
import Data.Text (Text)
import GHC.Real (Ratio)
import Unbound.Generics.LocallyNameless.Alpha (Alpha (..))
import Unbound.Generics.LocallyNameless.Bind (Bind (..))
import Unbound.Generics.LocallyNameless.Embed (Embed (..))
import Unbound.Generics.LocallyNameless.Name (Name (..))
import Unbound.Generics.LocallyNameless.Rebind (Rebind (..))
import Unbound.Generics.LocallyNameless.Rec (Rec,unrec)
import Unbound.Generics.LocallyNameless.Subst (Subst (..))
instance (NFData a, NFData b) => NFData (Bind a b)
instance NFData a => NFData (Embed a)
instance NFData (Name a)
instance (NFData a, NFData b) => NFData (Rebind a b)
instance (Alpha a, NFData a) => NFData (Rec a) where
rnf r = seq (rnf (unrec r)) ()
instance Subst b (Ratio a) where
subst _ _ = id
substs _ = id
instance Hashable (Name a) where
hashWithSalt salt (Fn str int) = hashWithSalt salt (hashWithSalt (hash int) str)
hashWithSalt salt (Bn i0 i1) = hashWithSalt salt (hash i0 `hashWithSalt` i1)
instance (Ord a) => Ord (Embed a) where
compare (Embed a) (Embed b) = compare a b
instance Alpha Text where
aeq' _ctx = (==)
fvAny' _ctx _nfn i = pure i
close _ctx _b = id
open _ctx _b = id
isPat _ = mempty
isTerm _ = True
nthPatFind _ = Left
namePatFind _ _ = Left 0
swaps' _ctx _p = id
freshen' _ctx i = return (i, mempty)
lfreshen' _ctx i cont = cont i mempty
acompare' _ctx = compare
instance Subst b Text where
subst _ _ = id
substs _ = id