morley-0.3.0.1: Developer tools for the Michelson Language

Safe HaskellNone
LanguageHaskell2010

Lorentz.Macro

Contents

Description

Common Michelson macros defined using Lorentz syntax.

Synopsis

Compare

ifEq0 :: IfCmp0Constraints a Eq' => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifGe0 :: IfCmp0Constraints a Ge => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifGt0 :: IfCmp0Constraints a Gt => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifLe0 :: IfCmp0Constraints a Le => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifLt0 :: IfCmp0Constraints a Lt => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifNeq0 :: IfCmp0Constraints a Neq => (s :-> s') -> (s :-> s') -> (a & s) :-> s' Source #

ifEq :: IfCmpXConstraints a b Eq' => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

ifGe :: IfCmpXConstraints a b Ge => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

ifGt :: IfCmpXConstraints a b Gt => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

ifLe :: IfCmpXConstraints a b Le => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

ifLt :: IfCmpXConstraints a b Lt => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

ifNeq :: IfCmpXConstraints a b Neq => (s :-> s') -> (s :-> s') -> (a & (b & s)) :-> s' Source #

Fail

fail_ :: a :-> c Source #

Warning: fail_ remains in code

Analog of the FAIL macro in Michelson. Its usage is discouraged because it doesn't carry any information about failure.

Assertion macros

They differ from the same macros in Michelson, because those macros use FAIL macro which is not informative (fails with unit). If you really want Michelson versions (maybe to produce exact copy of an existing contract), you can pass empty string, then FAILWITH will be called with unit, not empty string.

assert :: MText -> (Bool & s) :-> s Source #

assertEq0 :: IfCmp0Constraints a Eq' => MText -> (a & s) :-> s Source #

assertNeq0 :: IfCmp0Constraints a Neq => MText -> (a & s) :-> s Source #

assertLt0 :: IfCmp0Constraints a Lt => MText -> (a & s) :-> s Source #

assertGt0 :: IfCmp0Constraints a Gt => MText -> (a & s) :-> s Source #

assertLe0 :: IfCmp0Constraints a Le => MText -> (a & s) :-> s Source #

assertGe0 :: IfCmp0Constraints a Ge => MText -> (a & s) :-> s Source #

assertEq :: IfCmpXConstraints a b Eq' => MText -> (a & (b & s)) :-> s Source #

assertNeq :: IfCmpXConstraints a b Neq => MText -> (a & (b & s)) :-> s Source #

assertLt :: IfCmpXConstraints a b Lt => MText -> (a & (b & s)) :-> s Source #

assertGt :: IfCmpXConstraints a b Gt => MText -> (a & (b & s)) :-> s Source #

assertLe :: IfCmpXConstraints a b Le => MText -> (a & (b & s)) :-> s Source #

assertGe :: IfCmpXConstraints a b Ge => MText -> (a & (b & s)) :-> s Source #

assertSome :: MText -> (Maybe a & s) :-> (a & s) Source #

assertLeft :: MText -> (Either a b & s) :-> (a & s) Source #

assertRight :: MText -> (Either a b & s) :-> (b & s) Source #

Syntactic Conveniences

dipX :: forall (n :: Nat) inp out s s'. (DipX (ToPeano n) (Above (ToPeano n) inp) s s', (Above (ToPeano n) inp ++ s) ~ inp, (Above (ToPeano n) inp ++ s') ~ out) => (s :-> s') -> inp :-> out Source #

DII+P macro. For example, `dipX @3` is DIIIP.

dropX :: forall (n :: Nat) a inp out s s'. (DipX (ToPeano n) (Above (ToPeano n) inp) s s', (Above (ToPeano n) inp ++ s) ~ inp, (Above (ToPeano n) inp ++ s') ~ out, s ~ (a ': s')) => inp :-> out Source #

Custom Lorentz macro that drops element with given index (starting from 0) from the stack.

cloneX :: forall (n :: Nat) a s. CloneX (ToPeano n) a s => (a & s) :-> CloneXT (ToPeano n) a s Source #

Duplicate the top of the stack n times.

For example, `cloneX @3` has type `a & s :-> a & a & a & a & s`.

duupX :: forall (n :: Nat) inp. DuupX (ToPeano n) inp (At (ToPeano (n - 1)) inp) => inp :-> (At (ToPeano (n - 1)) inp & inp) Source #

DUU+P macro. For example, `duupX @3` is DUUUP, it puts the 3-rd (starting from 1) element to the top of the stack.

elevateX :: forall (n :: Nat) inp out s a. (DuupX (ToPeano (1 + n)) inp a, DipX (ToPeano (n + 1)) (Above (ToPeano (n + 1)) (a ': inp)) (a ': s) s, (a ': (Above (ToPeano n) inp ++ s)) ~ out, a ~ At (ToPeano n) inp, (Above (ToPeano (n + 1)) (a ': inp) ++ (a ': s)) ~ (a ': inp), (Above (ToPeano (n + 1)) (a ': inp) ++ s) ~ (a ': (Above (ToPeano n) inp ++ s)), ((1 + n) - 1) ~ n) => inp :-> out Source #

Move item with given index (starting from 0) to the top of the stack.

TODO: probably it can be implemented more efficiently, so if we ever want to optimize gas consumption we can rewrite it. It only makes sense if it's applied to a relatively large index.

caar :: (((a, b1), b2) & s) :-> (a & s) Source #

cadr :: (((a, b1), b2) & s) :-> (b1 & s) Source #

cdar :: ((a1, (a2, b)) & s) :-> (a2 & s) Source #

cddr :: ((a1, (a2, b)) & s) :-> (b & s) Source #

ifRight :: ((b & s) :-> s') -> ((a & s) :-> s') -> (Either a b & s) :-> s' Source #

ifSome :: ((a & s) :-> s') -> (s :-> s') -> (Maybe a & s) :-> s' Source #

mapCar :: ((a & s) :-> (a1 & s)) -> ((a, b) & s) :-> ((a1, b) & s) Source #

mapCdr :: ((b & ((a, b) & s)) :-> (b1 & ((a, b) & s))) -> ((a, b) & s) :-> ((a, b1) & s) Source #

papair :: (a & (b & (c & s))) :-> (((a, b), c) & s) Source #

ppaiir :: (a & (b & (c & s))) :-> ((a, (b, c)) & s) Source #

unpair :: ((a, b) & s) :-> (a & (b & s)) Source #

setCar :: ((a, b1) & (b2 & s)) :-> ((b2, b1) & s) Source #

setCdr :: ((a, b1) & (b2 & s)) :-> ((a, b2) & s) Source #

setInsert :: IsComparable e => (e & (Set e & s)) :-> (Set e & s) Source #

Insert given element into set.

This is a separate function from updateMap because stacks they operate with differ in length.

mapInsert :: (MapInstrs map, IsComparable k) => (k ': (v ': (map k v ': s))) :-> (map k v ': s) Source #

Insert given element into map.

setInsertNew :: (IsComparable e, KnownValue err) => (forall s0. (e ': s0) :-> (err ': s0)) -> (e & (Set e & s)) :-> (Set e & s) Source #

Insert given element into set, ensuring that it does not overwrite any existing entry.

As first argument accepts container name.

mapInsertNew :: (MapInstrs map, IsComparable k, KnownValue e) => (forall s0. (k ': s0) :-> (e ': s0)) -> (k ': (v ': (map k v ': s))) :-> (map k v ': s) Source #

Insert given element into map, ensuring that it does not overwrite any existing entry.

As first argument accepts container name (for error message).

deleteMap :: forall k v s. (MapInstrs map, IsComparable k, KnownValue k, KnownValue v) => (k ': (map k v ': s)) :-> (map k v ': s) Source #

Delete element from the map.

setDelete :: IsComparable e => (e & (Set e & s)) :-> (Set e & s) Source #

Delete given element from the set.

Additional Morley macros

data View (a :: Type) (r :: Type) Source #

view type synonym as described in A1.

Constructors

View 

Fields

Instances
Generic (View a r) Source # 
Instance details

Defined in Lorentz.Macro

Associated Types

type Rep (View a r) :: Type -> Type #

Methods

from :: View a r -> Rep (View a r) x #

to :: Rep (View a r) x -> View a r #

IsoValue a => IsoValue (View a r) Source # 
Instance details

Defined in Lorentz.Macro

Associated Types

type ToT (View a r) :: T Source #

Methods

toVal :: View a r -> Value (ToT (View a r)) Source #

fromVal :: Value (ToT (View a r)) -> View a r Source #

type Rep (View a r) Source # 
Instance details

Defined in Lorentz.Macro

type Rep (View a r) = D1 (MetaData "View" "Lorentz.Macro" "morley-0.3.0.1-Avb9bjjqJWNEobyGi9OGAh" False) (C1 (MetaCons "View" PrefixI True) (S1 (MetaSel (Just "viewParam") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Just "viewCallbackTo") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (ContractAddr (a, Maybe r)))))
type ToT (View a r) Source # 
Instance details

Defined in Lorentz.Macro

type ToT (View a r) = GValueType (Rep (View a r))

data Void_ (a :: Type) (b :: Type) Source #

void type synonym as described in A1.

Constructors

Void_ 

Fields

Instances
Generic (Void_ a b) Source # 
Instance details

Defined in Lorentz.Macro

Associated Types

type Rep (Void_ a b) :: Type -> Type #

Methods

from :: Void_ a b -> Rep (Void_ a b) x #

to :: Rep (Void_ a b) x -> Void_ a b #

IsoValue a => IsoValue (Void_ a b) Source # 
Instance details

Defined in Lorentz.Macro

Associated Types

type ToT (Void_ a b) :: T Source #

Methods

toVal :: Void_ a b -> Value (ToT (Void_ a b)) Source #

fromVal :: Value (ToT (Void_ a b)) -> Void_ a b Source #

type Rep (Void_ a b) Source # 
Instance details

Defined in Lorentz.Macro

type Rep (Void_ a b) = D1 (MetaData "Void_" "Lorentz.Macro" "morley-0.3.0.1-Avb9bjjqJWNEobyGi9OGAh" False) (C1 (MetaCons "Void_" PrefixI True) (S1 (MetaSel (Just "voidParam") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a) :*: S1 (MetaSel (Just "voidResProxy") NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (Lambda b b))))
type ToT (Void_ a b) Source # 
Instance details

Defined in Lorentz.Macro

type ToT (Void_ a b) = GValueType (Rep (Void_ a b))

newtype VoidResult r Source #

Newtype over void result type used in tests to distinguish successful void result from other errors.

Usage example: lExpectFailWith (== VoidResult roleMaster)`

Constructors

VoidResult 

Fields

Instances
Eq r => Eq (VoidResult r) Source # 
Instance details

Defined in Lorentz.Macro

Methods

(==) :: VoidResult r -> VoidResult r -> Bool #

(/=) :: VoidResult r -> VoidResult r -> Bool #

IsoValue r => IsoValue (VoidResult r) Source # 
Instance details

Defined in Lorentz.Macro

Associated Types

type ToT (VoidResult r) :: T Source #

type ToT (VoidResult r) Source # 
Instance details

Defined in Lorentz.Macro

type ToT (VoidResult r) = ToT r

view_ :: (KnownValue a, KnownValue r, NoOperation (a, r), NoBigMap (a, r)) => (forall s0. ((a, storage) & s0) :-> (r ': s0)) -> (View a r & (storage & s)) :-> ((List Operation, storage) & s) Source #

void_ :: forall a b s s' anything. KnownValue b => ((a & s) :-> (b & s')) -> (Void_ a b & s) :-> anything Source #

mkVoid :: forall b a. a -> Void_ a b Source #