kure-2.18.6: Combinators for Strategic Programming
Copyright(c) 2012--2021 The University of Kansas
LicenseBSD3
MaintainerNeil Sculthorpe <neil.sculthorpe@ntu.ac.uk>
Stabilitybeta
Portabilityghc
Safe HaskellSafe-Inferred
LanguageHaskell2010

Language.KURE.Injection

Description

This module provides a type class for injective functions (and their projections), and some useful interactions with Transform.

Synopsis

Injection Class

class Injection a u where Source #

A class of injective functions from a to b, and their projections. The following law is expected to hold:

project (inject a) == Just a

Methods

inject :: a -> u Source #

project :: u -> Maybe a Source #

Instances

Instances details
Injection a a Source #

There is an identity injection for all types.

Instance details

Defined in Language.KURE.Injection

Methods

inject :: a -> a Source #

project :: a -> Maybe a Source #

Injection a (Maybe a) Source # 
Instance details

Defined in Language.KURE.Injection

Methods

inject :: a -> Maybe a Source #

project :: Maybe a -> Maybe a Source #

Monad Injections

injectM :: (Monad m, Injection a u) => a -> m u Source #

Injects a value and lifts it into a Monad.

projectM :: (MonadFail m, Injection a u) => u -> m a Source #

Projects a value and lifts it into a Monad, with the possibility of failure.

projectWithFailMsgM :: (MonadFail m, Injection a u) => String -> u -> m a Source #

As projectM, but takes a custom error message to use if projection fails.

Transformation Injections

injectT :: (Monad m, Injection a u) => Transform c m a u Source #

Lifted inject.

projectT :: (MonadFail m, Injection a u) => Transform c m u a Source #

Lifted project, the transformation fails if the projection fails.

extractT :: (Monad m, Injection a u) => Transform c m u b -> Transform c m a b Source #

Convert a transformation over an injected value into a transformation over a non-injected value.

promoteT :: (MonadFail m, Injection a u) => Transform c m a b -> Transform c m u b Source #

Promote a transformation over a value into a transformation over an injection of that value, (failing if that injected value cannot be projected).

promoteWithFailMsgT :: (MonadFail m, Injection a u) => String -> Transform c m a b -> Transform c m u b Source #

As promoteT, but takes a custom error message to use if promotion fails.

Rewrite Injections

extractR :: (MonadFail m, Injection a u) => Rewrite c m u -> Rewrite c m a Source #

Convert a rewrite over an injected value into a rewrite over a projection of that value, (failing if that injected value cannot be projected).

promoteR :: (MonadFail m, Injection a u) => Rewrite c m a -> Rewrite c m u Source #

Promote a rewrite over a value into a rewrite over an injection of that value, (failing if that injected value cannot be projected).

extractWithFailMsgR :: (MonadFail m, Injection a u) => String -> Rewrite c m u -> Rewrite c m a Source #

As extractR, but takes a custom error message to use if extraction fails.

promoteWithFailMsgR :: (MonadFail m, Injection a u) => String -> Rewrite c m a -> Rewrite c m u Source #

As promoteR, but takes a custom error message to use if promotion fails.