{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternGuards #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

module Unison.Runtime.Builtin
  ( builtinTermNumbering,
    builtinTypeNumbering,
    builtinTermBackref,
    builtinTypeBackref,
    builtinArities,
    builtinOptInfo,
    numberedTermLookup,
    Sandbox (..),
    baseSandboxInfo,
    unitValue,
    natValue,
    builtinForeignNames,
    sandboxedForeignFuncs,
  )
where

import Control.Monad.State.Strict (State, execState, modify)
import Data.Map qualified as Map
import Data.Set (insert)
import Data.Set qualified as Set
import Data.Text qualified
import Unison.ABT.Normalized hiding (TTm)
import Unison.Builtin.Decls qualified as Ty
import Unison.Prelude hiding (Text, some)
import Unison.Reference
import Unison.Runtime.ANF as ANF
import Unison.Runtime.ANF.Optimize as ANF
import Unison.Runtime.Builtin.Types
import Unison.Runtime.Foreign.Function.Type (ForeignFunc (..), foreignFuncBuiltinName)
import Unison.Runtime.Stack (UnboxedTypeTag (..), Val (..), unboxedTypeTagToInt)
import Unison.Runtime.Stack qualified as Closure
import Unison.Runtime.TypeTags qualified as TT
import Unison.Symbol
import Unison.Type qualified as Ty
import Unison.Util.EnumContainers as EC
import Unison.Util.Text qualified as Util.Text
import Unison.Var

freshes :: (Var v) => Int -> [v]
freshes :: forall v. Var v => Int -> [v]
freshes = Set v -> Int -> [v]
forall v. Var v => Set v -> Int -> [v]
freshes' Set v
forall a. Monoid a => a
mempty

freshes' :: (Var v) => Set v -> Int -> [v]
freshes' :: forall v. Var v => Set v -> Int -> [v]
freshes' Set v
avoid0 = Set v -> [v] -> Int -> [v]
forall {t} {a}. (Num t, Var a, Eq t) => Set a -> [a] -> t -> [a]
go Set v
avoid0 []
  where
    go :: Set a -> [a] -> t -> [a]
go Set a
_ [a]
vs t
0 = [a]
vs
    go Set a
avoid [a]
vs t
n =
      let v :: a
v = Set a -> a -> a
forall v. Var v => Set v -> v -> v
freshIn Set a
avoid (a -> a) -> a -> a
forall a b. (a -> b) -> a -> b
$ Type -> a
forall v. Var v => Type -> v
typed Type
ANFBlank
       in Set a -> [a] -> t -> [a]
go (a -> Set a -> Set a
forall a. Ord a => a -> Set a -> Set a
insert a
v Set a
avoid) (a
v a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
vs) (t
n t -> t -> t
forall a. Num a => a -> a -> a
- t
1)

class Fresh t where fresh :: t

fresh1 :: (Var v) => v
fresh1 :: forall v. Var v => v
fresh1 = [v] -> v
forall a. HasCallStack => [a] -> a
head ([v] -> v) -> [v] -> v
forall a b. (a -> b) -> a -> b
$ Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
1

instance (Var v) => Fresh (v, v) where
  fresh :: (v, v)
fresh = (v
v1, v
v2)
    where
      [v
v1, v
v2] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
2

instance (Var v) => Fresh (v, v, v) where
  fresh :: (v, v, v)
fresh = (v
v1, v
v2, v
v3)
    where
      [v
v1, v
v2, v
v3] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
3

instance (Var v) => Fresh (v, v, v, v) where
  fresh :: (v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4)
    where
      [v
v1, v
v2, v
v3, v
v4] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
4

instance (Var v) => Fresh (v, v, v, v, v) where
  fresh :: (v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
5

instance (Var v) => Fresh (v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
6

instance (Var v) => Fresh (v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
7

instance (Var v) => Fresh (v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
8

instance (Var v) => Fresh (v, v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
9

instance (Var v) => Fresh (v, v, v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
10

instance (Var v) => Fresh (v, v, v, v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
11

instance (Var v) => Fresh (v, v, v, v, v, v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11, v
v12, v
v13)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11, v
v12, v
v13] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
13

instance (Var v) => Fresh (v, v, v, v, v, v, v, v, v, v, v, v, v, v) where
  fresh :: (v, v, v, v, v, v, v, v, v, v, v, v, v, v)
fresh = (v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11, v
v12, v
v13, v
v14)
    where
      [v
v1, v
v2, v
v3, v
v4, v
v5, v
v6, v
v7, v
v8, v
v9, v
v10, v
v11, v
v12, v
v13, v
v14] = Int -> [v]
forall v. Var v => Int -> [v]
freshes Int
14

fls, tru :: (Var v) => ANormal Reference v
fls :: forall v. Var v => ANormal Reference v
fls = Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.booleanRef CTag
0 []
tru :: forall v. Var v => ANormal Reference v
tru = Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.booleanRef CTag
1 []

left, right :: (Var v) => v -> ANormal Reference v
left :: forall v. Var v => v -> ANormal Reference v
left v
x = Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.eitherRef (Word64 -> CTag
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
Ty.eitherLeftId) [v
x]
right :: forall v. Var v => v -> ANormal Reference v
right v
x = Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.eitherRef (Word64 -> CTag
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
Ty.eitherRightId) [v
x]

unop0 :: (Var v) => Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 :: forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
n [v] -> ANormal ref v
f =
  [Mem] -> ANormal ref v -> SuperNormal ref v
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX]
    (ANormal ref v -> SuperNormal ref v)
-> (ANormal ref v -> ANormal ref v)
-> ANormal ref v
-> SuperNormal ref v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> ANormal ref v -> ANormal ref v
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [v
x0]
    (ANormal ref v -> SuperNormal ref v)
-> ANormal ref v -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ [v] -> ANormal ref v
f [v]
xs
  where
    xs :: [v]
xs@(v
x0 : [v]
_) = Int -> [v]
forall v. Var v => Int -> [v]
freshes (Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n)

binop0 :: (Var v) => Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 :: forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
n [v] -> ANormal ref v
f =
  [Mem] -> ANormal ref v -> SuperNormal ref v
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX, Mem
BX]
    (ANormal ref v -> SuperNormal ref v)
-> (ANormal ref v -> ANormal ref v)
-> ANormal ref v
-> SuperNormal ref v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> ANormal ref v -> ANormal ref v
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [v
x0, v
y0]
    (ANormal ref v -> SuperNormal ref v)
-> ANormal ref v -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ [v] -> ANormal ref v
f [v]
xs
  where
    xs :: [v]
xs@(v
x0 : v
y0 : [v]
_) = Int -> [v]
forall v. Var v => Int -> [v]
freshes (Int
2 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
n)

unop :: (Var v) => POp -> SuperNormal ref v
unop :: forall v ref. Var v => POp -> SuperNormal ref v
unop POp
pop =
  Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x] ->
    (POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
pop [v
x])

binop ::
  (Var v) =>
  POp ->
  SuperNormal ref v
binop :: forall v ref. Var v => POp -> SuperNormal ref v
binop POp
pop =
  Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
pop [v
x, v
y]

-- | Like `binop`, but swaps the arguments.
binopSwap :: (Var v) => POp -> SuperNormal ref v
binopSwap :: forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
pop =
  Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
pop [v
y, v
x]

addi, subi, muli, divi, modi, shli, shri, powi :: (Var v) => SuperNormal ref v
addi :: forall v ref. Var v => SuperNormal ref v
addi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ADDI
subi :: forall v ref. Var v => SuperNormal ref v
subi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SUBI
muli :: forall v ref. Var v => SuperNormal ref v
muli = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MULI
divi :: forall v ref. Var v => SuperNormal ref v
divi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
DIVI
modi :: forall v ref. Var v => SuperNormal ref v
modi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MODI
shli :: forall v ref. Var v => SuperNormal ref v
shli = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SHLI
shri :: forall v ref. Var v => SuperNormal ref v
shri = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SHRI
powi :: forall v ref. Var v => SuperNormal ref v
powi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
POWI

addn, subn, muln, divn, modn, shln, shrn, pown, dropn :: (Var v) => SuperNormal ref v
addn :: forall v ref. Var v => SuperNormal ref v
addn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ADDN
subn :: forall v ref. Var v => SuperNormal ref v
subn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SUBN
muln :: forall v ref. Var v => SuperNormal ref v
muln = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MULN
divn :: forall v ref. Var v => SuperNormal ref v
divn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
DIVN
modn :: forall v ref. Var v => SuperNormal ref v
modn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MODN
shln :: forall v ref. Var v => SuperNormal ref v
shln = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SHLN
shrn :: forall v ref. Var v => SuperNormal ref v
shrn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SHRN
pown :: forall v ref. Var v => SuperNormal ref v
pown = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
POWN
dropn :: forall v ref. Var v => SuperNormal ref v
dropn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
DRPN

eqi, eqn, lti, ltn, lei, len :: (Var v) => SuperNormal ref v
eqi :: forall v ref. Var v => SuperNormal ref v
eqi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
EQLI
lti :: forall v ref. Var v => SuperNormal ref v
lti = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LESI
lei :: forall v ref. Var v => SuperNormal ref v
lei = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LEQI
eqn :: forall v ref. Var v => SuperNormal ref v
eqn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
EQLN
ltn :: forall v ref. Var v => SuperNormal ref v
ltn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LESN
len :: forall v ref. Var v => SuperNormal ref v
len = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LEQN

gti, gtn, gei, gen :: (Var v) => SuperNormal ref v
gti :: forall v ref. Var v => SuperNormal ref v
gti = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LESI
gei :: forall v ref. Var v => SuperNormal ref v
gei = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LEQI
gtn :: forall v ref. Var v => SuperNormal ref v
gtn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LESN
gen :: forall v ref. Var v => SuperNormal ref v
gen = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LEQN

inci, incn :: (Var v) => SuperNormal ref v
inci :: forall v ref. Var v => SuperNormal ref v
inci = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
INCI
incn :: forall v ref. Var v => SuperNormal ref v
incn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
INCN

sgni, negi :: (Var v) => SuperNormal ref v
sgni :: forall v ref. Var v => SuperNormal ref v
sgni = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
SGNI
negi :: forall v ref. Var v => SuperNormal ref v
negi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
NEGI

lzeron, tzeron, lzeroi, tzeroi, popn, popi :: (Var v) => SuperNormal ref v
lzeron :: forall v ref. Var v => SuperNormal ref v
lzeron = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
LZRO
tzeron :: forall v ref. Var v => SuperNormal ref v
tzeron = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TZRO
popn :: forall v ref. Var v => SuperNormal ref v
popn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
POPC
popi :: forall v ref. Var v => SuperNormal ref v
popi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
POPC
lzeroi :: forall v ref. Var v => SuperNormal ref v
lzeroi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
LZRO
tzeroi :: forall v ref. Var v => SuperNormal ref v
tzeroi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TZRO

andn, orn, xorn, compln, andi, ori, xori, compli :: (Var v) => SuperNormal ref v
andn :: forall v ref. Var v => SuperNormal ref v
andn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ANDN
orn :: forall v ref. Var v => SuperNormal ref v
orn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IORN
xorn :: forall v ref. Var v => SuperNormal ref v
xorn = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
XORN
compln :: forall v ref. Var v => SuperNormal ref v
compln = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
COMN
andi :: forall v ref. Var v => SuperNormal ref v
andi = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ANDI
ori :: forall v ref. Var v => SuperNormal ref v
ori = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IORI
xori :: forall v ref. Var v => SuperNormal ref v
xori = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
XORI
compli :: forall v ref. Var v => SuperNormal ref v
compli = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
COMI

addf,
  subf,
  mulf,
  divf,
  powf,
  sqrtf,
  logf,
  logbf ::
    (Var v) => SuperNormal ref v
addf :: forall v ref. Var v => SuperNormal ref v
addf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ADDF
subf :: forall v ref. Var v => SuperNormal ref v
subf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SUBF
mulf :: forall v ref. Var v => SuperNormal ref v
mulf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MULF
divf :: forall v ref. Var v => SuperNormal ref v
divf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
DIVF
powf :: forall v ref. Var v => SuperNormal ref v
powf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
POWF
sqrtf :: forall v ref. Var v => SuperNormal ref v
sqrtf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
SQRT
logf :: forall v ref. Var v => SuperNormal ref v
logf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
LOGF
logbf :: forall v ref. Var v => SuperNormal ref v
logbf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LOGB

expf, absf :: (Var v) => SuperNormal ref v
expf :: forall v ref. Var v => SuperNormal ref v
expf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
EXPF
absf :: forall v ref. Var v => SuperNormal ref v
absf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ABSF

cosf, sinf, tanf, acosf, asinf, atanf :: (Var v) => SuperNormal ref v
cosf :: forall v ref. Var v => SuperNormal ref v
cosf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
COSF
sinf :: forall v ref. Var v => SuperNormal ref v
sinf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
SINF
tanf :: forall v ref. Var v => SuperNormal ref v
tanf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TANF
acosf :: forall v ref. Var v => SuperNormal ref v
acosf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ACOS
asinf :: forall v ref. Var v => SuperNormal ref v
asinf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ASIN
atanf :: forall v ref. Var v => SuperNormal ref v
atanf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ATAN

coshf,
  sinhf,
  tanhf,
  acoshf,
  asinhf,
  atanhf,
  atan2f ::
    (Var v) => SuperNormal ref v
coshf :: forall v ref. Var v => SuperNormal ref v
coshf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
COSH
sinhf :: forall v ref. Var v => SuperNormal ref v
sinhf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
SINH
tanhf :: forall v ref. Var v => SuperNormal ref v
tanhf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TANH
acoshf :: forall v ref. Var v => SuperNormal ref v
acoshf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ACSH
asinhf :: forall v ref. Var v => SuperNormal ref v
asinhf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ASNH
atanhf :: forall v ref. Var v => SuperNormal ref v
atanhf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ATNH
atan2f :: forall v ref. Var v => SuperNormal ref v
atan2f = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ATN2

ltf, gtf, lef, gef, eqf, neqf :: (Var v) => SuperNormal ref v
ltf :: forall v ref. Var v => SuperNormal ref v
ltf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LESF
gtf :: forall v ref. Var v => SuperNormal ref v
gtf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LESF
lef :: forall v ref. Var v => SuperNormal ref v
lef = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LEQF
gef :: forall v ref. Var v => SuperNormal ref v
gef = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LEQF
eqf :: forall v ref. Var v => SuperNormal ref v
eqf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
EQLF
neqf :: forall v ref. Var v => SuperNormal ref v
neqf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
NEQF

minf, maxf :: (Var v) => SuperNormal ref v
minf :: forall v ref. Var v => SuperNormal ref v
minf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MINF
maxf :: forall v ref. Var v => SuperNormal ref v
maxf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
MAXF

ceilf, floorf, truncf, roundf, i2f, n2f :: (Var v) => SuperNormal ref v
ceilf :: forall v ref. Var v => SuperNormal ref v
ceilf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
CEIL
floorf :: forall v ref. Var v => SuperNormal ref v
floorf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
FLOR
truncf :: forall v ref. Var v => SuperNormal ref v
truncf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TRNF
roundf :: forall v ref. Var v => SuperNormal ref v
roundf = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
RNDF
i2f :: forall v ref. Var v => SuperNormal ref v
i2f = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
ITOF
n2f :: forall v ref. Var v => SuperNormal ref v
n2f = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
NTOF

trni :: (Var v) => SuperNormal ref v
trni :: forall v ref. Var v => SuperNormal ref v
trni = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TRNC

modular :: (Var v) => POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular :: forall v ref.
Var v =>
POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular POp
pop Bool -> ANormal ref v
ret =
  Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
2 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
m, v
t] ->
    v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD v
t Mem
UN (Lit ref -> ANormal ref v
forall v ref. Var v => Lit ref -> ANormal ref v
TLit (Lit ref -> ANormal ref v) -> Lit ref -> ANormal ref v
forall a b. (a -> b) -> a -> b
$ Int64 -> Lit ref
forall ref. Int64 -> Lit ref
I Int64
2)
      (ANormal ref v -> ANormal ref v)
-> (Branched ref (ANormal ref v) -> ANormal ref v)
-> Branched ref (ANormal ref v)
-> ANormal ref v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD v
m Mem
UN (POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
pop [v
x, v
t])
      (ANormal ref v -> ANormal ref v)
-> (Branched ref (ANormal ref v) -> ANormal ref v)
-> Branched ref (ANormal ref v)
-> ANormal ref v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> Branched ref (ANormal ref v) -> ANormal ref v
forall v ref.
Var v =>
v -> Branched ref (ANormal ref v) -> ANormal ref v
TMatch v
m
      (Branched ref (ANormal ref v) -> ANormal ref v)
-> Branched ref (ANormal ref v) -> ANormal ref v
forall a b. (a -> b) -> a -> b
$ EnumMap Word64 (ANormal ref v)
-> Maybe (ANormal ref v) -> Branched ref (ANormal ref v)
forall ref e. EnumMap Word64 e -> Maybe e -> Branched ref e
MatchIntegral
        (Word64 -> ANormal ref v -> EnumMap Word64 (ANormal ref v)
forall k a. EnumKey k => k -> a -> EnumMap k a
mapSingleton Word64
1 (ANormal ref v -> EnumMap Word64 (ANormal ref v))
-> ANormal ref v -> EnumMap Word64 (ANormal ref v)
forall a b. (a -> b) -> a -> b
$ Bool -> ANormal ref v
ret Bool
True)
        (ANormal ref v -> Maybe (ANormal ref v)
forall a. a -> Maybe a
Just (ANormal ref v -> Maybe (ANormal ref v))
-> ANormal ref v -> Maybe (ANormal ref v)
forall a b. (a -> b) -> a -> b
$ Bool -> ANormal ref v
ret Bool
False)

evni, evnn, oddi, oddn :: (Var v) => SuperNormal Reference v
evni :: forall v. Var v => SuperNormal Reference v
evni = POp -> (Bool -> ANormal Reference v) -> SuperNormal Reference v
forall v ref.
Var v =>
POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular POp
MODI (\Bool
b -> if Bool
b then ANormal Reference v
forall v. Var v => ANormal Reference v
fls else ANormal Reference v
forall v. Var v => ANormal Reference v
tru)
oddi :: forall v. Var v => SuperNormal Reference v
oddi = POp -> (Bool -> ANormal Reference v) -> SuperNormal Reference v
forall v ref.
Var v =>
POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular POp
MODI (\Bool
b -> if Bool
b then ANormal Reference v
forall v. Var v => ANormal Reference v
tru else ANormal Reference v
forall v. Var v => ANormal Reference v
fls)
evnn :: forall v. Var v => SuperNormal Reference v
evnn = POp -> (Bool -> ANormal Reference v) -> SuperNormal Reference v
forall v ref.
Var v =>
POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular POp
MODN (\Bool
b -> if Bool
b then ANormal Reference v
forall v. Var v => ANormal Reference v
fls else ANormal Reference v
forall v. Var v => ANormal Reference v
tru)
oddn :: forall v. Var v => SuperNormal Reference v
oddn = POp -> (Bool -> ANormal Reference v) -> SuperNormal Reference v
forall v ref.
Var v =>
POp -> (Bool -> ANormal ref v) -> SuperNormal ref v
modular POp
MODN (\Bool
b -> if Bool
b then ANormal Reference v
forall v. Var v => ANormal Reference v
tru else ANormal Reference v
forall v. Var v => ANormal Reference v
fls)

appendt, taket, dropt, indext, indexb, sizet, unconst, unsnoct :: (Var v) => SuperNormal ref v
appendt :: forall v ref. Var v => SuperNormal ref v
appendt = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CATT [v
x, v
y]
taket :: forall v ref. Var v => SuperNormal ref v
taket = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] ->
  POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TAKT [v
x, v
y]
dropt :: forall v ref. Var v => SuperNormal ref v
dropt = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] ->
  POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
DRPT [v
x, v
y]

atb :: forall ref. SuperNormal ref Symbol
atb = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IDXB

indext :: forall v ref. Var v => SuperNormal ref v
indext = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IXOT

indexb :: forall v ref. Var v => SuperNormal ref v
indexb = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IXOB

sizet :: forall v ref. Var v => SuperNormal ref v
sizet = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SIZT [v
x]

unconst :: forall v ref. Var v => SuperNormal ref v
unconst = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
UCNS

unsnoct :: forall v ref. Var v => SuperNormal ref v
unsnoct = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
USNC

appends, conss, snocs :: (Var v) => SuperNormal ref v
appends :: forall v ref. Var v => SuperNormal ref v
appends = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CATS [v
x, v
y]
conss :: forall v ref. Var v => SuperNormal ref v
conss = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CONS [v
x, v
y]
snocs :: forall v ref. Var v => SuperNormal ref v
snocs = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SNOC [v
x, v
y]

takes, drops, sizes, ats, emptys :: (Var v) => SuperNormal ref v
takes :: forall v ref. Var v => SuperNormal ref v
takes = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TAKS [v
x, v
y]
drops :: forall v ref. Var v => SuperNormal ref v
drops = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x, v
y] -> POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
DRPS [v
x, v
y]
sizes :: forall v ref. Var v => SuperNormal ref v
sizes = Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([v] -> ANormal ref v) -> SuperNormal ref v)
-> ([v] -> ANormal ref v) -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ \[v
x] -> (POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SIZS [v
x])
ats :: forall v ref. Var v => SuperNormal ref v
ats = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IDXS
emptys :: forall v ref. Var v => SuperNormal ref v
emptys = [Mem] -> ANormal ref v -> SuperNormal ref v
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [] (ANormal ref v -> SuperNormal ref v)
-> ANormal ref v -> SuperNormal ref v
forall a b. (a -> b) -> a -> b
$ POp -> [v] -> ANormal ref v
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
BLDS []

viewls, viewrs :: (Var v) => SuperNormal ref v
viewls :: forall v ref. Var v => SuperNormal ref v
viewls = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
VWLS
viewrs :: forall v ref. Var v => SuperNormal ref v
viewrs = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
VWRS

splitls, splitrs :: (Var v) => SuperNormal ref v
splitls :: forall v ref. Var v => SuperNormal ref v
splitls = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SPLL
splitrs :: forall v ref. Var v => SuperNormal ref v
splitrs = POp -> SuperNormal ref v
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SPLR

eqt, neqt, leqt, geqt, lesst, great :: SuperNormal ref Symbol
eqt :: forall ref. SuperNormal ref Symbol
eqt = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
EQLT
neqt :: forall ref. SuperNormal ref Symbol
neqt = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
1 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x, Symbol
y, Symbol
b] ->
  Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
b Mem
UN (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
EQLT [Symbol
x, Symbol
y]) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
    POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
NOTB [Symbol
b]
leqt :: forall ref. SuperNormal ref Symbol
leqt = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LEQT
geqt :: forall ref. SuperNormal ref Symbol
geqt = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LEQT
lesst :: forall ref. SuperNormal ref Symbol
lesst = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
1 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x, Symbol
y, Symbol
b] ->
  Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
b Mem
UN (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
LEQT [Symbol
y, Symbol
x]) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
    POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
NOTB [Symbol
b]
great :: forall ref. SuperNormal ref Symbol
great = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
1 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x, Symbol
y, Symbol
b] ->
  Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
b Mem
UN (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
LEQT [Symbol
x, Symbol
y]) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
    POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
NOTB [Symbol
b]

packt, unpackt :: SuperNormal ref Symbol
packt :: forall ref. SuperNormal ref Symbol
packt = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
s] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
PAKT [Symbol
s]
unpackt :: forall ref. SuperNormal ref Symbol
unpackt = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
t] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
UPKT [Symbol
t]

packb, unpackb, emptyb, appendb :: SuperNormal ref Symbol
packb :: forall ref. SuperNormal ref Symbol
packb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
s] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
PAKB [Symbol
s]
unpackb :: forall ref. SuperNormal ref Symbol
unpackb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
b] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
UPKB [Symbol
b]
emptyb :: forall ref. SuperNormal ref Symbol
emptyb =
  [Mem] -> ANormal ref Symbol -> SuperNormal ref Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda []
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol
-> SuperNormal ref Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
es Mem
BX (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
BLDS [])
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> ANormal ref Symbol -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
PAKB [Symbol
es]
  where
    es :: Symbol
es = Symbol
forall v. Var v => v
fresh1
appendb :: forall ref. SuperNormal ref Symbol
appendb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x, Symbol
y] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CATB [Symbol
x, Symbol
y]

takeb, dropb, atb, sizeb, flattenb :: SuperNormal ref Symbol
takeb :: forall ref. SuperNormal ref Symbol
takeb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
n, Symbol
b] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TAKB [Symbol
n, Symbol
b]
dropb :: forall ref. SuperNormal ref Symbol
dropb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
n, Symbol
b] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
DRPB [Symbol
n, Symbol
b]
sizeb :: forall ref. SuperNormal ref Symbol
sizeb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
b] -> (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SIZB [Symbol
b])
flattenb :: forall ref. SuperNormal ref Symbol
flattenb = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
b] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
FLTB [Symbol
b]

i2t, n2t, f2t :: SuperNormal ref Symbol
i2t :: forall ref. SuperNormal ref Symbol
i2t = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
n] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
ITOT [Symbol
n]
n2t :: forall ref. SuperNormal ref Symbol
n2t = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
n] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
NTOT [Symbol
n]
f2t :: forall ref. SuperNormal ref Symbol
f2t = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
f] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
FTOT [Symbol
f]

t2i, t2n, t2f :: SuperNormal ref Symbol
t2i :: forall ref. SuperNormal ref Symbol
t2i = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TTOI
t2n :: forall ref. SuperNormal ref Symbol
t2n = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TTON
t2f :: forall ref. SuperNormal ref Symbol
t2f = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
TTOF

equ :: SuperNormal ref Symbol
equ :: forall ref. SuperNormal ref Symbol
equ = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
EQLU

cmpu :: SuperNormal ref Symbol
cmpu :: forall ref. SuperNormal ref Symbol
cmpu = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
CMPU

ltu :: SuperNormal ref Symbol
ltu :: forall ref. SuperNormal ref Symbol
ltu = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LESU

gtu :: SuperNormal ref Symbol
gtu :: forall ref. SuperNormal ref Symbol
gtu = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LESU

geu :: SuperNormal ref Symbol
geu :: forall ref. SuperNormal ref Symbol
geu = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binopSwap POp
LEQU

leu :: SuperNormal ref Symbol
leu :: forall ref. SuperNormal ref Symbol
leu = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
LEQU

notb :: SuperNormal ref Symbol
notb :: forall ref. SuperNormal ref Symbol
notb = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
NOTB

orb :: SuperNormal ref Symbol
orb :: forall ref. SuperNormal ref Symbol
orb = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
IORB

andb :: SuperNormal ref Symbol
andb :: forall ref. SuperNormal ref Symbol
andb = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
ANDB

-- A runtime type-cast. Used to unsafely coerce between unboxed
-- types at runtime without changing their representation.
coerceType :: UnboxedTypeTag -> SuperNormal ref Symbol
coerceType :: forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
destType =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
1 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
v, Symbol
tag] ->
    Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
tag Mem
UN (Lit ref -> ANormal ref Symbol
forall v ref. Var v => Lit ref -> ANormal ref v
TLit (Lit ref -> ANormal ref Symbol) -> Lit ref -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$ Int64 -> Lit ref
forall ref. Int64 -> Lit ref
I (Int64 -> Lit ref) -> Int64 -> Lit ref
forall a b. (a -> b) -> a -> b
$ Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int64) -> Int -> Int64
forall a b. (a -> b) -> a -> b
$ UnboxedTypeTag -> Int
unboxedTypeTagToInt UnboxedTypeTag
destType) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
      POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CAST [Symbol
v, Symbol
tag]

-- This version of unsafeCoerce is the identity function. It works
-- only if the two types being coerced between are actually the same,
-- because it keeps the same representation. It is not capable of
-- e.g. correctly translating between two types with compatible bit
-- representations, because tagging information will be retained.
poly'coerce :: SuperNormal ref Symbol
poly'coerce :: forall ref. SuperNormal ref Symbol
poly'coerce = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x] -> Symbol -> ANormal ref Symbol
forall v ref. Var v => v -> ANormal ref v
TVar Symbol
x

jumpk :: SuperNormal ref Symbol
jumpk :: forall ref. SuperNormal ref Symbol
jumpk = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
k, Symbol
a] -> Symbol -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => v -> [v] -> ANormal ref v
TKon Symbol
k [Symbol
a]

scope'run :: SuperNormal Reference Symbol
scope'run :: SuperNormal Reference Symbol
scope'run =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
1 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
e, Symbol
un] ->
    Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
un Mem
BX (Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.unitRef CTag
0 []) (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$
      Func Reference Symbol -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => Func ref v -> [v] -> ANormal ref v
TApp (Symbol -> Func Reference Symbol
forall ref v. v -> Func ref v
FVar Symbol
e) [Symbol
un]

fork'comp :: SuperNormal Reference Symbol
fork'comp :: SuperNormal Reference Symbol
fork'comp =
  [Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX]
    (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> SuperNormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
act
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
unit Mem
BX (Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.unitRef CTag
0 [])
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Either Reference Symbol
-> [Symbol]
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Either ref v -> [v] -> ANormal ref v -> ANormal ref v
TName Symbol
lz (Symbol -> Either Reference Symbol
forall a b. b -> Either a b
Right Symbol
act) [Symbol
unit]
    (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
FORK [Symbol
lz]
  where
    (Symbol
act, Symbol
unit, Symbol
lz) = (Symbol, Symbol, Symbol)
forall t. Fresh t => t
fresh

try'eval :: SuperNormal Reference Symbol
try'eval :: SuperNormal Reference Symbol
try'eval =
  [Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX]
    (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
act
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
unit Mem
BX (Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.unitRef CTag
0 [])
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Either Reference Symbol
-> [Symbol]
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Either ref v -> [v] -> ANormal ref v -> ANormal ref v
TName Symbol
lz (Symbol -> Either Reference Symbol
forall a b. b -> Either a b
Right Symbol
act) [Symbol
unit]
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
ta Mem
UN (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TFRC [Symbol
lz])
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Branched Reference (ANormal Reference Symbol)
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Branched ref (ANormal ref v) -> ANormal ref v
TMatch Symbol
ta
    (Branched Reference (ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> Branched Reference (ANormal Reference Symbol))
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> Branched Reference (ANormal Reference Symbol)
forall ref e. EnumMap Word64 ([Mem], e) -> Branched ref e
MatchSum
    (EnumMap Word64 ([Mem], ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ [(Word64, ([Mem], ANormal Reference Symbol))]
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
forall k a. EnumKey k => [(k, a)] -> EnumMap k a
mapFromList
      [ Symbol
-> Symbol
-> Symbol
-> Symbol
-> Symbol
-> (Word64, ([Mem], ANormal Reference Symbol))
forall v.
Var v =>
v -> v -> v -> v -> v -> (Word64, ([Mem], ANormal Reference v))
exnCase Symbol
lnk Symbol
msg Symbol
xtra Symbol
any Symbol
fail,
        (Word64
1, ([Mem
BX], Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
r (Symbol -> ANormal Reference Symbol
forall v ref. Var v => v -> ANormal ref v
TVar Symbol
r)))
      ]
  where
    (Symbol
act, Symbol
unit, Symbol
lz, Symbol
ta, Symbol
lnk, Symbol
msg, Symbol
xtra, Symbol
any, Symbol
fail, Symbol
r) = (Symbol, Symbol, Symbol, Symbol, Symbol, Symbol, Symbol, Symbol,
 Symbol, Symbol)
forall t. Fresh t => t
fresh

bug :: Util.Text.Text -> SuperNormal ref Symbol
bug :: forall ref. Text -> SuperNormal ref Symbol
bug Text
name =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
1 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x, Symbol
n] ->
    Symbol
-> Mem
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
n Mem
BX (Lit ref -> ANormal ref Symbol
forall v ref. Var v => Lit ref -> ANormal ref v
TLit (Lit ref -> ANormal ref Symbol) -> Lit ref -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$ Text -> Lit ref
forall ref. Text -> Lit ref
T Text
name) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
      POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
EROR [Symbol
n, Symbol
x]

watch :: SuperNormal ref Symbol
watch :: forall ref. SuperNormal ref Symbol
watch =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
t, Symbol
v] ->
    Direction Word16
-> [Symbol]
-> [Mem]
-> ANormal ref Symbol
-> ANormal ref Symbol
-> ANormal ref Symbol
forall v ref.
Var v =>
Direction Word16
-> [v] -> [Mem] -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLets Direction Word16
forall a. Direction a
Direct [] [] (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
PRNT [Symbol
t]) (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol -> ANormal ref Symbol
forall a b. (a -> b) -> a -> b
$
      Symbol -> ANormal ref Symbol
forall v ref. Var v => v -> ANormal ref v
TVar Symbol
v

raise :: SuperNormal Reference Symbol
raise :: SuperNormal Reference Symbol
raise =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
2 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
ah, Symbol
r, Symbol
f, Symbol
n] ->
    Symbol
-> Branched Reference (ANormal Reference Symbol)
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Branched ref (ANormal ref v) -> ANormal ref v
TMatch Symbol
r
      (Branched Reference (ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> (EnumMap CTag ([Mem], ANormal Reference Symbol)
    -> Branched Reference (ANormal Reference Symbol))
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
 -> ANormal Reference Symbol
 -> Branched Reference (ANormal Reference Symbol))
-> ANormal Reference Symbol
-> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
-> Branched Reference (ANormal Reference Symbol)
forall a b c. (a -> b -> c) -> b -> a -> c
flip [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
-> ANormal Reference Symbol
-> Branched Reference (ANormal Reference Symbol)
forall ref e.
[(ref, EnumMap CTag ([Mem], e))] -> e -> Branched ref e
MatchRequest (Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
f (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ Symbol -> ANormal Reference Symbol
forall v ref. Var v => v -> ANormal ref v
TVar Symbol
f)
      ([(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
 -> Branched Reference (ANormal Reference Symbol))
-> (EnumMap CTag ([Mem], ANormal Reference Symbol)
    -> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))])
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
-> Branched Reference (ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))
-> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
-> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
forall a. a -> [a] -> [a]
: [])
      ((Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))
 -> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))])
-> (EnumMap CTag ([Mem], ANormal Reference Symbol)
    -> (Reference, EnumMap CTag ([Mem], ANormal Reference Symbol)))
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
-> [(Reference, EnumMap CTag ([Mem], ANormal Reference Symbol))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Reference
Ty.exceptionRef,)
      (EnumMap CTag ([Mem], ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ CTag
-> ([Mem], ANormal Reference Symbol)
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
forall k a. EnumKey k => k -> a -> EnumMap k a
mapSingleton
        CTag
0
        ( [Mem
BX],
          Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
f
            (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Direction Word16
-> [Symbol]
-> [Mem]
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
Direction Word16
-> [v] -> [Mem] -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLets Direction Word16
forall a. Direction a
Direct [] [] (Symbol -> ANormal Reference Symbol
forall v ref. Var v => v -> ANormal ref v
TDiscard Symbol
ah)
            (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
n Mem
BX (Lit Reference -> ANormal Reference Symbol
forall v ref. Var v => Lit ref -> ANormal ref v
TLit (Lit Reference -> ANormal Reference Symbol)
-> Lit Reference -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ Text -> Lit Reference
forall ref. Text -> Lit ref
T Text
"builtin.raise")
            (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
EROR [Symbol
n, Symbol
f]
        )

gen'trace :: SuperNormal Reference Symbol
gen'trace :: SuperNormal Reference Symbol
gen'trace =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
t, Symbol
v] ->
    Direction Word16
-> [Symbol]
-> [Mem]
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
Direction Word16
-> [v] -> [Mem] -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLets Direction Word16
forall a. Direction a
Direct [] [] (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TRCE [Symbol
t, Symbol
v]) (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$
      Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.unitRef CTag
0 []

debug'text :: SuperNormal ref Symbol
debug'text :: forall ref. SuperNormal ref Symbol
debug'text = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
DBTX

code'missing :: SuperNormal ref Symbol
code'missing :: forall ref. SuperNormal ref Symbol
code'missing = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
MISS

code'cache :: SuperNormal ref Symbol
code'cache :: forall ref. SuperNormal ref Symbol
code'cache = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
new] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
CACH [Symbol
new]

code'lookup :: SuperNormal ref Symbol
code'lookup :: forall ref. SuperNormal ref Symbol
code'lookup = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
LKUP

code'validate :: SuperNormal ref Symbol
code'validate :: forall ref. SuperNormal ref Symbol
code'validate = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
unop POp
CVLD

term'link'to'text :: SuperNormal ref Symbol
term'link'to'text :: forall ref. SuperNormal ref Symbol
term'link'to'text =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
link] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TLTT [Symbol
link]

value'load :: SuperNormal Reference Symbol
value'load :: SuperNormal Reference Symbol
value'load =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
2 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
vlu, Symbol
t, Symbol
r] ->
    Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
t Mem
UN (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
LOAD [Symbol
vlu])
      (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Branched Reference (ANormal Reference Symbol)
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Branched ref (ANormal ref v) -> ANormal ref v
TMatch Symbol
t
      (Branched Reference (ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> (EnumMap Word64 ([Mem], ANormal Reference Symbol)
    -> Branched Reference (ANormal Reference Symbol))
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> Branched Reference (ANormal Reference Symbol)
forall ref e. EnumMap Word64 ([Mem], e) -> Branched ref e
MatchSum
      (EnumMap Word64 ([Mem], ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
-> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ [(Word64, ([Mem], ANormal Reference Symbol))]
-> EnumMap Word64 ([Mem], ANormal Reference Symbol)
forall k a. EnumKey k => [(k, a)] -> EnumMap k a
mapFromList
        [ (Word64
0, ([Mem
BX], Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
r (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ Symbol -> ANormal Reference Symbol
forall v. Var v => v -> ANormal Reference v
left Symbol
r)),
          (Word64
1, ([Mem
BX], Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
r (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol -> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ Symbol -> ANormal Reference Symbol
forall v. Var v => v -> ANormal Reference v
right Symbol
r))
        ]

value'create :: SuperNormal ref Symbol
value'create :: forall ref. SuperNormal ref Symbol
value'create = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
x] -> POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
VALU [Symbol
x]

check'sandbox :: SuperNormal ref Symbol
check'sandbox :: forall ref. SuperNormal ref Symbol
check'sandbox = POp -> SuperNormal ref Symbol
forall v ref. Var v => POp -> SuperNormal ref v
binop POp
SDBX

sandbox'links :: SuperNormal ref Symbol
sandbox'links :: forall ref. SuperNormal ref Symbol
sandbox'links = [Mem] -> ANormal ref Symbol -> SuperNormal ref Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX] (ANormal ref Symbol -> SuperNormal ref Symbol)
-> (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol
-> SuperNormal ref Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> ANormal ref Symbol -> ANormal ref Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
ln (ANormal ref Symbol -> SuperNormal ref Symbol)
-> ANormal ref Symbol -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SDBL [Symbol
ln]
  where
    ln :: Symbol
ln = Symbol
forall v. Var v => v
fresh1

value'sandbox :: SuperNormal ref Symbol
value'sandbox :: forall ref. SuperNormal ref Symbol
value'sandbox =
  [Mem] -> ANormal ref Symbol -> SuperNormal ref Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX, Mem
BX]
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol
-> SuperNormal ref Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal ref Symbol -> ANormal ref Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol
refs, Symbol
val]
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> ANormal ref Symbol -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
SDBV [Symbol
refs, Symbol
val]
  where
    (Symbol
refs, Symbol
val) = (Symbol, Symbol)
forall t. Fresh t => t
fresh

stm'atomic :: SuperNormal Reference Symbol
stm'atomic :: SuperNormal Reference Symbol
stm'atomic =
  [Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX]
    (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> SuperNormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
act
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
unit Mem
BX (Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.unitRef CTag
0 [])
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Either Reference Symbol
-> [Symbol]
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Either ref v -> [v] -> ANormal ref v -> ANormal ref v
TName Symbol
lz (Symbol -> Either Reference Symbol
forall a b. b -> Either a b
Right Symbol
act) [Symbol
unit]
    (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
ATOM [Symbol
lz]
  where
    (Symbol
act, Symbol
unit, Symbol
lz) = (Symbol, Symbol, Symbol)
forall t. Fresh t => t
fresh

type ForeignOp = ForeignFunc -> ([Mem], ANormal Reference Symbol)

any'construct :: SuperNormal Reference Symbol
any'construct :: SuperNormal Reference Symbol
any'construct =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
v] ->
    Reference -> CTag -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.anyRef CTag
0 [Symbol
v]

any'extract :: SuperNormal Reference Symbol
any'extract :: SuperNormal Reference Symbol
any'extract =
  Int
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
1 (([Symbol] -> ANormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> ([Symbol] -> ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$
    \[Symbol
v, Symbol
v1] ->
      Symbol
-> Branched Reference (ANormal Reference Symbol)
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Branched ref (ANormal ref v) -> ANormal ref v
TMatch Symbol
v (Branched Reference (ANormal Reference Symbol)
 -> ANormal Reference Symbol)
-> Branched Reference (ANormal Reference Symbol)
-> ANormal Reference Symbol
forall a b. (a -> b) -> a -> b
$
        Reference
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
-> Maybe (ANormal Reference Symbol)
-> Branched Reference (ANormal Reference Symbol)
forall ref e.
ref -> EnumMap CTag ([Mem], e) -> Maybe e -> Branched ref e
MatchData Reference
Ty.anyRef (CTag
-> ([Mem], ANormal Reference Symbol)
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
forall k a. EnumKey k => k -> a -> EnumMap k a
mapSingleton CTag
0 (([Mem], ANormal Reference Symbol)
 -> EnumMap CTag ([Mem], ANormal Reference Symbol))
-> ([Mem], ANormal Reference Symbol)
-> EnumMap CTag ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ([Mem
BX], Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
v1 (Symbol -> ANormal Reference Symbol
forall v ref. Var v => v -> ANormal ref v
TVar Symbol
v1))) Maybe (ANormal Reference Symbol)
forall a. Maybe a
Nothing

-- Refs

-- The docs for IORef state that IORef operations can be observed
-- out of order ([1]) but actually GHC does emit the appropriate
-- load and store barriers nowadays ([2], [3]).
--
-- [1] https://hackage.haskell.org/package/base-4.17.0.0/docs/Data-IORef.html#g:2
-- [2] https://github.com/ghc/ghc/blob/master/compiler/GHC/StgToCmm/Prim.hs#L286
-- [3] https://github.com/ghc/ghc/blob/master/compiler/GHC/StgToCmm/Prim.hs#L298
ref'read :: SuperNormal ref Symbol
ref'read :: forall ref. SuperNormal ref Symbol
ref'read =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
ref] -> (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
REFR [Symbol
ref])

ref'write :: SuperNormal ref Symbol
ref'write :: forall ref. SuperNormal ref Symbol
ref'write =
  Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
binop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ \[Symbol
ref, Symbol
val] -> (POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
REFW [Symbol
ref, Symbol
val])

-- In GHC, CAS returns both a Boolean and the current value of the
-- IORef, which can be used to retry a failed CAS.
-- This strategy is more efficient than returning a Boolean only
-- because it uses a single call to cmpxchg in assembly (see [1]) to
-- avoid an extra read per CAS iteration, however it's not supported
-- in Scheme.
-- Therefore, we adopt the more common signature that only returns a
-- Boolean, which doesn't even suffer from spurious failures because
-- GHC issues loads of mutable variables with memory_order_acquire
-- (see [2])
--
-- [1]: https://github.com/ghc/ghc/blob/master/rts/PrimOps.cmm#L697
-- [2]: https://github.com/ghc/ghc/blob/master/compiler/GHC/StgToCmm/Prim.hs#L285
ref'cas :: SuperNormal ref Symbol
ref'cas :: forall ref. SuperNormal ref Symbol
ref'cas =
  [Mem] -> ANormal ref Symbol -> SuperNormal ref Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [Mem
BX, Mem
BX, Mem
BX]
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> (ANormal ref Symbol -> ANormal ref Symbol)
-> ANormal ref Symbol
-> SuperNormal ref Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal ref Symbol -> ANormal ref Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol
x, Symbol
y, Symbol
z]
    (ANormal ref Symbol -> SuperNormal ref Symbol)
-> ANormal ref Symbol -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
RCAS [Symbol
x, Symbol
y, Symbol
z]
  where
    (Symbol
x, Symbol
y, Symbol
z) = (Symbol, Symbol, Symbol)
forall t. Fresh t => t
fresh

ref'ticket'read :: SuperNormal ref Symbol
ref'ticket'read :: forall ref. SuperNormal ref Symbol
ref'ticket'read = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
TIKR

ref'readForCas :: SuperNormal ref Symbol
ref'readForCas :: forall ref. SuperNormal ref Symbol
ref'readForCas = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
RRFC

ref'new :: SuperNormal ref Symbol
ref'new :: forall ref. SuperNormal ref Symbol
ref'new = Int -> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall v ref.
Var v =>
Int -> ([v] -> ANormal ref v) -> SuperNormal ref v
unop0 Int
0 (([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol)
-> ([Symbol] -> ANormal ref Symbol) -> SuperNormal ref Symbol
forall a b. (a -> b) -> a -> b
$ POp -> [Symbol] -> ANormal ref Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
REFN

crypto'hash :: ForeignOp
crypto'hash :: ForeignOp
crypto'hash ForeignFunc
instr =
  ([Mem
BX, Mem
BX],)
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ([Mem], ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol
alg, Symbol
x]
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
vl Mem
BX (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
VALU [Symbol
x])
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [Symbol
alg, Symbol
vl]
  where
    (Symbol
alg, Symbol
x, Symbol
vl) = (Symbol, Symbol, Symbol)
forall t. Fresh t => t
fresh

murmur'hash :: ForeignOp
murmur'hash :: ForeignOp
murmur'hash ForeignFunc
instr =
  ([Mem
BX],)
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ([Mem], ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol
x]
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
vl Mem
BX (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
VALU [Symbol
x])
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [Symbol
vl]
  where
    (Symbol
x, Symbol
vl) = (Symbol, Symbol)
forall t. Fresh t => t
fresh

crypto'hmac :: ForeignOp
crypto'hmac :: ForeignOp
crypto'hmac ForeignFunc
instr =
  ([Mem
BX, Mem
BX, Mem
BX],)
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ([Mem], ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol
alg, Symbol
by, Symbol
x]
    (ANormal Reference Symbol -> ANormal Reference Symbol)
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol
-> Mem
-> ANormal Reference Symbol
-> ANormal Reference Symbol
-> ANormal Reference Symbol
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD Symbol
vl Mem
BX (POp -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => POp -> [v] -> ANormal ref v
TPrm POp
VALU [Symbol
x])
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [Symbol
alg, Symbol
by, Symbol
vl]
  where
    (Symbol
alg, Symbol
by, Symbol
x, Symbol
vl) = (Symbol, Symbol, Symbol, Symbol)
forall t. Fresh t => t
fresh

exnCase ::
  (Var v) => v -> v -> v -> v -> v -> (Word64, ([Mem], ANormal Reference v))
exnCase :: forall v.
Var v =>
v -> v -> v -> v -> v -> (Word64, ([Mem], ANormal Reference v))
exnCase v
stack1 v
stack2 v
stack3 v
any v
fail =
  (Word64
0,)
    (([Mem], ANormal Reference v)
 -> (Word64, ([Mem], ANormal Reference v)))
-> (ANormal Reference v -> ([Mem], ANormal Reference v))
-> ANormal Reference v
-> (Word64, ([Mem], ANormal Reference v))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Mem
BX, Mem
BX, Mem
BX],)
    (ANormal Reference v -> ([Mem], ANormal Reference v))
-> (ANormal Reference v -> ANormal Reference v)
-> ANormal Reference v
-> ([Mem], ANormal Reference v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [v] -> ANormal Reference v -> ANormal Reference v
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [v
stack1, v
stack2, v
stack3]
    (ANormal Reference v -> ANormal Reference v)
-> (ANormal Reference v -> ANormal Reference v)
-> ANormal Reference v
-> ANormal Reference v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v
-> Mem
-> ANormal Reference v
-> ANormal Reference v
-> ANormal Reference v
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD v
any Mem
BX (Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.anyRef CTag
0 [v
stack3])
    (ANormal Reference v -> ANormal Reference v)
-> (ANormal Reference v -> ANormal Reference v)
-> ANormal Reference v
-> ANormal Reference v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v
-> Mem
-> ANormal Reference v
-> ANormal Reference v
-> ANormal Reference v
forall v ref.
Var v =>
v -> Mem -> ANormal ref v -> ANormal ref v -> ANormal ref v
TLetD v
fail Mem
BX (Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TCon Reference
Ty.failureRef CTag
0 [v
stack1, v
stack2, v
any])
    (ANormal Reference v -> (Word64, ([Mem], ANormal Reference v)))
-> ANormal Reference v -> (Word64, ([Mem], ANormal Reference v))
forall a b. (a -> b) -> a -> b
$ Reference -> CTag -> [v] -> ANormal Reference v
forall v ref. Var v => ref -> CTag -> [v] -> ANormal ref v
TReq Reference
Ty.exceptionRef CTag
0 [v
fail]

-- Input / Output glue
--
-- These are pairings of input and output functions to handle a
-- foreign call.  The input function represents the numbers and types
-- of the inputs to a foreign call.  The output function takes the
-- result of the foreign call and turns it into a Unison type.
--

-- a
direct :: ForeignOp
direct :: ForeignOp
direct ForeignFunc
instr = ([], ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [])

argNDirect :: Int -> ForeignOp
argNDirect :: Int -> ForeignOp
argNDirect Int
n ForeignFunc
instr =
  (Int -> Mem -> [Mem]
forall a. Int -> a -> [a]
replicate Int
n Mem
BX,)
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ([Mem], ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Symbol] -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => [v] -> Term f v -> Term f v
TAbss [Symbol]
args
    (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [Symbol]
args
  where
    args :: [Symbol]
args = Int -> [Symbol]
forall v. Var v => Int -> [v]
freshes Int
n

--  () -> a
--
--  Unit is unique in that we don't actually pass it as an arg
unitDirect :: ForeignOp
unitDirect :: ForeignOp
unitDirect ForeignFunc
instr = ([Mem
BX],) (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> (ANormal Reference Symbol -> ANormal Reference Symbol)
-> ANormal Reference Symbol
-> ([Mem], ANormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> ANormal Reference Symbol -> ANormal Reference Symbol
forall v (f :: * -> * -> *). Var v => v -> Term f v -> Term f v
TAbs Symbol
arg (ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol))
-> ANormal Reference Symbol -> ([Mem], ANormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ ForeignFunc -> [Symbol] -> ANormal Reference Symbol
forall v ref. Var v => ForeignFunc -> [v] -> ANormal ref v
TFOp ForeignFunc
instr [] where arg :: Symbol
arg = Symbol
forall v. Var v => v
fresh1

builtinLookup ::
  Map.Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup :: Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup =
  [(Reference, (Sandbox, SuperNormal Reference Symbol))]
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
    ([(Reference, (Sandbox, SuperNormal Reference Symbol))]
 -> Map Reference (Sandbox, SuperNormal Reference Symbol))
-> ([(Text, (Sandbox, SuperNormal Reference Symbol))]
    -> [(Reference, (Sandbox, SuperNormal Reference Symbol))])
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Text, (Sandbox, SuperNormal Reference Symbol))
 -> (Reference, (Sandbox, SuperNormal Reference Symbol)))
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
-> [(Reference, (Sandbox, SuperNormal Reference Symbol))]
forall a b. (a -> b) -> [a] -> [b]
map (\(Text
t, (Sandbox, SuperNormal Reference Symbol)
f) -> (Text -> Reference
forall t h. t -> Reference' t h
Builtin Text
t, (Sandbox, SuperNormal Reference Symbol)
f))
    ([(Text, (Sandbox, SuperNormal Reference Symbol))]
 -> Map Reference (Sandbox, SuperNormal Reference Symbol))
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ [ (Text
"Int.+", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
addi)),
        (Text
"Int.-", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
subi)),
        (Text
"Int.*", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
muli)),
        (Text
"Int./", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
divi)),
        (Text
"Int.mod", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
modi)),
        (Text
"Int.==", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
eqi)),
        (Text
"Int.<", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
lti)),
        (Text
"Int.<=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
lei)),
        (Text
"Int.>", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gti)),
        (Text
"Int.>=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gei)),
        (Text
"Int.fromRepresentation", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
IntTag)),
        (Text
"Int.toRepresentation", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
NatTag)),
        (Text
"Int.increment", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
inci)),
        (Text
"Int.signum", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sgni)),
        (Text
"Int.negate", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
negi)),
        (Text
"Int.truncate0", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
trni)),
        (Text
"Int.isEven", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v. Var v => SuperNormal Reference v
evni)),
        (Text
"Int.isOdd", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v. Var v => SuperNormal Reference v
oddi)),
        (Text
"Int.shiftLeft", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
shli)),
        (Text
"Int.shiftRight", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
shri)),
        (Text
"Int.trailingZeros", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
tzeroi)),
        (Text
"Int.leadingZeros", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
lzeroi)),
        (Text
"Int.and", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
andi)),
        (Text
"Int.or", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
ori)),
        (Text
"Int.xor", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
xori)),
        (Text
"Int.complement", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
compli)),
        (Text
"Int.pow", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
powi)),
        (Text
"Int.toText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
i2t)),
        (Text
"Int.fromText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
t2i)),
        (Text
"Int.toFloat", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
i2f)),
        (Text
"Int.popCount", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
popi)),
        (Text
"Nat.+", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
addn)),
        (Text
"Nat.-", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
subn)),
        (Text
"Nat.sub", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
subn)),
        (Text
"Nat.*", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
muln)),
        (Text
"Nat./", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
divn)),
        (Text
"Nat.mod", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
modn)),
        (Text
"Nat.==", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
eqn)),
        (Text
"Nat.<", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
ltn)),
        (Text
"Nat.<=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
len)),
        (Text
"Nat.>", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gtn)),
        (Text
"Nat.>=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gen)),
        (Text
"Nat.increment", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
incn)),
        (Text
"Nat.isEven", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v. Var v => SuperNormal Reference v
evnn)),
        (Text
"Nat.isOdd", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v. Var v => SuperNormal Reference v
oddn)),
        (Text
"Nat.shiftLeft", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
shln)),
        (Text
"Nat.shiftRight", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
shrn)),
        (Text
"Nat.trailingZeros", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
tzeron)),
        (Text
"Nat.leadingZeros", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
lzeron)),
        (Text
"Nat.and", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
andn)),
        (Text
"Nat.or", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
orn)),
        (Text
"Nat.xor", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
xorn)),
        (Text
"Nat.complement", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
compln)),
        (Text
"Nat.pow", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
pown)),
        (Text
"Nat.drop", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
dropn)),
        (Text
"Nat.toInt", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
IntTag)),
        (Text
"Nat.toFloat", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
n2f)),
        (Text
"Nat.toText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
n2t)),
        (Text
"Nat.fromText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
t2n)),
        (Text
"Nat.popCount", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
popn)),
        (Text
"Float.+", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
addf)),
        (Text
"Float.-", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
subf)),
        (Text
"Float.*", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
mulf)),
        (Text
"Float./", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
divf)),
        (Text
"Float.pow", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
powf)),
        (Text
"Float.log", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
logf)),
        (Text
"Float.logBase", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
logbf)),
        (Text
"Float.sqrt", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sqrtf)),
        (Text
"Float.fromRepresentation", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
FloatTag)),
        (Text
"Float.toRepresentation", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
NatTag)),
        (Text
"Float.min", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
minf)),
        (Text
"Float.max", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
maxf)),
        (Text
"Float.<", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
ltf)),
        (Text
"Float.>", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gtf)),
        (Text
"Float.<=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
lef)),
        (Text
"Float.>=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
gef)),
        (Text
"Float.==", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
eqf)),
        (Text
"Float.!=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
neqf)),
        (Text
"Float.acos", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
acosf)),
        (Text
"Float.asin", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
asinf)),
        (Text
"Float.atan", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
atanf)),
        (Text
"Float.cos", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
cosf)),
        (Text
"Float.sin", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sinf)),
        (Text
"Float.tan", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
tanf)),
        (Text
"Float.acosh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
acoshf)),
        (Text
"Float.asinh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
asinhf)),
        (Text
"Float.atanh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
atanhf)),
        (Text
"Float.cosh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
coshf)),
        (Text
"Float.sinh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sinhf)),
        (Text
"Float.tanh", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
tanhf)),
        (Text
"Float.exp", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
expf)),
        (Text
"Float.abs", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
absf)),
        (Text
"Float.ceiling", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
ceilf)),
        (Text
"Float.floor", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
floorf)),
        (Text
"Float.round", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
roundf)),
        (Text
"Float.truncate", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
truncf)),
        (Text
"Float.atan2", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
atan2f)),
        (Text
"Float.toText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
f2t)),
        (Text
"Float.fromText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
t2f)),
        -- text
        (Text
"Text.empty", (Sandbox
Untracked, [Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda [] (ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall a b. (a -> b) -> a -> b
$ Lit Reference -> ANormal Reference Symbol
forall v ref. Var v => Lit ref -> ANormal ref v
TLit (Text -> Lit Reference
forall ref. Text -> Lit ref
T Text
""))),
        (Text
"Text.++", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
appendt)),
        (Text
"Text.take", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
taket)),
        (Text
"Text.drop", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
dropt)),
        (Text
"Text.indexOf", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
indext)),
        (Text
"Text.size", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sizet)),
        (Text
"Text.==", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
eqt)),
        (Text
"Text.!=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
neqt)),
        (Text
"Text.<=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
leqt)),
        (Text
"Text.>=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
geqt)),
        (Text
"Text.<", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
lesst)),
        (Text
"Text.>", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
great)),
        (Text
"Text.uncons", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
unconst)),
        (Text
"Text.unsnoc", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
unsnoct)),
        (Text
"Text.toCharList", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
unpackt)),
        (Text
"Text.fromCharList", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
packt)),
        (Text
"Boolean.not", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
notb)),
        (Text
"Boolean.or", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
orb)),
        (Text
"Boolean.and", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
andb)),
        (Text
"bug", (Sandbox
Untracked, Text -> SuperNormal Reference Symbol
forall ref. Text -> SuperNormal ref Symbol
bug Text
"builtin.bug")),
        (Text
"todo", (Sandbox
Untracked, Text -> SuperNormal Reference Symbol
forall ref. Text -> SuperNormal ref Symbol
bug Text
"builtin.todo")),
        (Text
"Debug.watch", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
watch)),
        (Text
"Debug.trace", (Sandbox
Tracked, SuperNormal Reference Symbol
gen'trace)),
        (Text
"Debug.toText", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
debug'text)),
        (Text
"unsafe.coerceAbilities", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
poly'coerce)),
        (Text
"Char.toNat", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
NatTag)),
        (Text
"Char.fromNat", (Sandbox
Untracked, UnboxedTypeTag -> SuperNormal Reference Symbol
forall ref. UnboxedTypeTag -> SuperNormal ref Symbol
coerceType UnboxedTypeTag
CharTag)),
        (Text
"Bytes.empty", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
emptyb)),
        (Text
"Bytes.fromList", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
packb)),
        (Text
"Bytes.toList", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
unpackb)),
        (Text
"Bytes.++", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
appendb)),
        (Text
"Bytes.take", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
takeb)),
        (Text
"Bytes.drop", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
dropb)),
        (Text
"Bytes.at", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
atb)),
        (Text
"Bytes.indexOf", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
indexb)),
        (Text
"Bytes.size", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
sizeb)),
        (Text
"Bytes.flatten", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
flattenb)),
        (Text
"List.take", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
takes)),
        (Text
"List.drop", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
drops)),
        (Text
"List.size", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
sizes)),
        (Text
"List.++", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
appends)),
        (Text
"List.at", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
ats)),
        (Text
"List.cons", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
conss)),
        (Text
"List.snoc", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
snocs)),
        (Text
"List.empty", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
emptys)),
        (Text
"List.viewl", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
viewls)),
        (Text
"List.viewr", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
viewrs)),
        (Text
"List.splitLeft", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
splitls)),
        (Text
"List.splitRight", (Sandbox
Untracked, SuperNormal Reference Symbol
forall v ref. Var v => SuperNormal ref v
splitrs)),
        --
        --   , B "Debug.watch" $ forall1 "a" (\a -> text --> a --> a)
        (Text
"Universal.==", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
equ)),
        (Text
"Universal.compare", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
cmpu)),
        (Text
"Universal.>", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
gtu)),
        (Text
"Universal.<", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ltu)),
        (Text
"Universal.>=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
geu)),
        (Text
"Universal.<=", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
leu)),
        -- internal stuff
        (Text
"jumpCont", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
jumpk)),
        (Text
"raise", (Sandbox
Untracked, SuperNormal Reference Symbol
raise)),
        (Text
"IO.forkComp.v2", (Sandbox
Tracked, SuperNormal Reference Symbol
fork'comp)),
        (Text
"Scope.run", (Sandbox
Untracked, SuperNormal Reference Symbol
scope'run)),
        (Text
"Code.isMissing", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
code'missing)),
        (Text
"Code.cache_", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
code'cache)),
        (Text
"Code.lookup", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
code'lookup)),
        (Text
"Code.validate", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
code'validate)),
        (Text
"Value.load", (Sandbox
Tracked, SuperNormal Reference Symbol
value'load)),
        (Text
"Value.value", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
value'create)),
        (Text
"Any.Any", (Sandbox
Untracked, SuperNormal Reference Symbol
any'construct)),
        (Text
"Any.unsafeExtract", (Sandbox
Untracked, SuperNormal Reference Symbol
any'extract)),
        (Text
"Link.Term.toText", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
term'link'to'text)),
        (Text
"STM.atomically", (Sandbox
Tracked, SuperNormal Reference Symbol
stm'atomic)),
        (Text
"validateSandboxed", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
check'sandbox)),
        (Text
"Value.validateSandboxed", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
value'sandbox)),
        (Text
"sandboxLinks", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
sandbox'links)),
        (Text
"IO.tryEval", (Sandbox
Tracked, SuperNormal Reference Symbol
try'eval)),
        (Text
"Ref.read", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'read)),
        (Text
"Ref.write", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'write)),
        (Text
"Ref.cas", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'cas)),
        (Text
"Ref.Ticket.read", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'ticket'read)),
        (Text
"Ref.readForCas", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'readForCas)),
        (Text
"Scope.ref", (Sandbox
Untracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'new)),
        (Text
"IO.ref", (Sandbox
Tracked, SuperNormal Reference Symbol
forall ref. SuperNormal ref Symbol
ref'new))
      ]
      [(Text, (Sandbox, SuperNormal Reference Symbol))]
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
forall a. [a] -> [a] -> [a]
++ [(Text, (Sandbox, SuperNormal Reference Symbol))]
foreignWrappers

type FDecl v = State (Map ForeignFunc (Sandbox, SuperNormal Reference v))

-- Data type to determine whether a builtin should be tracked for
-- sandboxing. Untracked means that it can be freely used, and Tracked
-- means that the sandboxing check will by default consider them
-- disallowed.
data Sandbox = Tracked | Untracked
  deriving (Sandbox -> Sandbox -> Bool
(Sandbox -> Sandbox -> Bool)
-> (Sandbox -> Sandbox -> Bool) -> Eq Sandbox
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Sandbox -> Sandbox -> Bool
== :: Sandbox -> Sandbox -> Bool
$c/= :: Sandbox -> Sandbox -> Bool
/= :: Sandbox -> Sandbox -> Bool
Eq, Eq Sandbox
Eq Sandbox =>
(Sandbox -> Sandbox -> Ordering)
-> (Sandbox -> Sandbox -> Bool)
-> (Sandbox -> Sandbox -> Bool)
-> (Sandbox -> Sandbox -> Bool)
-> (Sandbox -> Sandbox -> Bool)
-> (Sandbox -> Sandbox -> Sandbox)
-> (Sandbox -> Sandbox -> Sandbox)
-> Ord Sandbox
Sandbox -> Sandbox -> Bool
Sandbox -> Sandbox -> Ordering
Sandbox -> Sandbox -> Sandbox
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Sandbox -> Sandbox -> Ordering
compare :: Sandbox -> Sandbox -> Ordering
$c< :: Sandbox -> Sandbox -> Bool
< :: Sandbox -> Sandbox -> Bool
$c<= :: Sandbox -> Sandbox -> Bool
<= :: Sandbox -> Sandbox -> Bool
$c> :: Sandbox -> Sandbox -> Bool
> :: Sandbox -> Sandbox -> Bool
$c>= :: Sandbox -> Sandbox -> Bool
>= :: Sandbox -> Sandbox -> Bool
$cmax :: Sandbox -> Sandbox -> Sandbox
max :: Sandbox -> Sandbox -> Sandbox
$cmin :: Sandbox -> Sandbox -> Sandbox
min :: Sandbox -> Sandbox -> Sandbox
Ord, Int -> Sandbox -> ShowS
[Sandbox] -> ShowS
Sandbox -> String
(Int -> Sandbox -> ShowS)
-> (Sandbox -> String) -> ([Sandbox] -> ShowS) -> Show Sandbox
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Sandbox -> ShowS
showsPrec :: Int -> Sandbox -> ShowS
$cshow :: Sandbox -> String
show :: Sandbox -> String
$cshowList :: [Sandbox] -> ShowS
showList :: [Sandbox] -> ShowS
Show, ReadPrec [Sandbox]
ReadPrec Sandbox
Int -> ReadS Sandbox
ReadS [Sandbox]
(Int -> ReadS Sandbox)
-> ReadS [Sandbox]
-> ReadPrec Sandbox
-> ReadPrec [Sandbox]
-> Read Sandbox
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Sandbox
readsPrec :: Int -> ReadS Sandbox
$creadList :: ReadS [Sandbox]
readList :: ReadS [Sandbox]
$creadPrec :: ReadPrec Sandbox
readPrec :: ReadPrec Sandbox
$creadListPrec :: ReadPrec [Sandbox]
readListPrec :: ReadPrec [Sandbox]
Read, Int -> Sandbox
Sandbox -> Int
Sandbox -> [Sandbox]
Sandbox -> Sandbox
Sandbox -> Sandbox -> [Sandbox]
Sandbox -> Sandbox -> Sandbox -> [Sandbox]
(Sandbox -> Sandbox)
-> (Sandbox -> Sandbox)
-> (Int -> Sandbox)
-> (Sandbox -> Int)
-> (Sandbox -> [Sandbox])
-> (Sandbox -> Sandbox -> [Sandbox])
-> (Sandbox -> Sandbox -> [Sandbox])
-> (Sandbox -> Sandbox -> Sandbox -> [Sandbox])
-> Enum Sandbox
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: Sandbox -> Sandbox
succ :: Sandbox -> Sandbox
$cpred :: Sandbox -> Sandbox
pred :: Sandbox -> Sandbox
$ctoEnum :: Int -> Sandbox
toEnum :: Int -> Sandbox
$cfromEnum :: Sandbox -> Int
fromEnum :: Sandbox -> Int
$cenumFrom :: Sandbox -> [Sandbox]
enumFrom :: Sandbox -> [Sandbox]
$cenumFromThen :: Sandbox -> Sandbox -> [Sandbox]
enumFromThen :: Sandbox -> Sandbox -> [Sandbox]
$cenumFromTo :: Sandbox -> Sandbox -> [Sandbox]
enumFromTo :: Sandbox -> Sandbox -> [Sandbox]
$cenumFromThenTo :: Sandbox -> Sandbox -> Sandbox -> [Sandbox]
enumFromThenTo :: Sandbox -> Sandbox -> Sandbox -> [Sandbox]
Enum, Sandbox
Sandbox -> Sandbox -> Bounded Sandbox
forall a. a -> a -> Bounded a
$cminBound :: Sandbox
minBound :: Sandbox
$cmaxBound :: Sandbox
maxBound :: Sandbox
Bounded)

declareForeignWrap ::
  Sandbox ->
  ForeignOp ->
  ForeignFunc ->
  FDecl Symbol ()
declareForeignWrap :: Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
sand ForeignOp
wrap ForeignFunc
func =
  (Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
 -> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol))
-> FDecl Symbol ()
forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
  -> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol))
 -> FDecl Symbol ())
-> (Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
    -> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol))
-> FDecl Symbol ()
forall a b. (a -> b) -> a -> b
$ ForeignFunc
-> (Sandbox, SuperNormal Reference Symbol)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert ForeignFunc
func (Sandbox
sand, SuperNormal Reference Symbol
code)
  where
    code :: SuperNormal Reference Symbol
code = ([Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol)
-> ([Mem], ANormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [Mem] -> ANormal Reference Symbol -> SuperNormal Reference Symbol
forall ref v. [Mem] -> ANormal ref v -> SuperNormal ref v
Lambda (ForeignOp
wrap ForeignFunc
func)

declareForeign ::
  Sandbox ->
  Int ->
  ForeignFunc ->
  FDecl Symbol ()
declareForeign :: Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
sand Int
arity ForeignFunc
func = Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
sand ForeignOp
wrap ForeignFunc
func
  where
    -- Special case: turn 0-arg foreigns into unit-accepting functions
    wrap :: ForeignOp
wrap
      | Int
0 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
arity = ForeignOp
unitDirect
      | Bool
otherwise = Int -> ForeignOp
argNDirect Int
arity

unitValue :: Val
unitValue :: Val
unitValue = Closure -> Val
BoxedVal (Closure -> Val) -> Closure -> Val
forall a b. (a -> b) -> a -> b
$ Reference -> PackedTag -> Closure
Closure.Enum Reference
Ty.unitRef PackedTag
TT.unitTag

natValue :: Word64 -> Val
natValue :: Word64 -> Val
natValue Word64
w = Word64 -> Val
NatVal Word64
w

declareUdpForeigns :: FDecl Symbol ()
declareUdpForeigns :: FDecl Symbol ()
declareUdpForeigns = do
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_UDP_clientSocket_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_UDPSocket_recv_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_UDP_UDPSocket_send_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_UDPSocket_close_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_ListenSocket_close_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_UDPSocket_toText_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_UDP_serverSocket_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_ListenSocket_toText_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_ListenSocket_recvFrom_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_UDP_ClientSockAddr_toText_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
3 ForeignFunc
IO_UDP_ListenSocket_sendTo_impl_v1

declareIntegerForeigns :: FDecl Symbol ()
declareIntegerForeigns :: FDecl Symbol ()
declareIntegerForeigns = do
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_fromText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_unsafeFromText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_toText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_fromInt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_toInt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_add
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_sub
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_mul
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_div
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_mod
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_pow
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_shl
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_shr
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_and
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_or
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_xor
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_popCount
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_truncate0
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_isEven
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_isOdd
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_eq
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_lt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_gt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Integer_ge
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_neg
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_abs
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_signum
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Integer_toFloat

declareNaturalForeigns :: FDecl Symbol ()
declareNaturalForeigns :: FDecl Symbol ()
declareNaturalForeigns = do
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_fromText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_unsafeFromText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_toText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_fromNat
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_toNat
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_add
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_sub
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_mul
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_div
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_mod
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_pow
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_shl
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_shr
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_and
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_or
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_xor
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_popCount
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_isEven
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_isOdd
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_eq
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_lt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_gt
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Natural_ge
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Natural_toFloat

declareForeigns :: FDecl Symbol ()
declareForeigns :: FDecl Symbol ()
declareForeigns = do
  FDecl Symbol ()
declareUdpForeigns
  FDecl Symbol ()
declareIntegerForeigns
  FDecl Symbol ()
declareNaturalForeigns
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_openFile_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_closeFile_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_isFileEOF_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_isFileOpen_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getEcho_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_ready_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getChar_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_isSeekable_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
3 ForeignFunc
IO_seekHandle_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_handlePosition_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getBuffering_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_setBuffering_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_setEcho_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getLine_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_getBytes_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_getSomeBytes_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_putBytes_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_fillBuf_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
3 ForeignFunc
IO_putBuf_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_getBufSome_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
IO_systemTime_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
IO_systemTimeMicroseconds_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
Clock_internals_monotonic_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
Clock_internals_realtime_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
Clock_internals_processCPUTime_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
Clock_internals_threadCPUTime_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Clock_internals_sec_v1

  -- A TimeSpec that comes from getTime never has negative nanos,
  -- so we can safely cast to Nat
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Clock_internals_nsec_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Clock_internals_systemTimeZone_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
IO_getTempDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_createTempDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
IO_getCurrentDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_setCurrentDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_fileExists_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getEnv_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
IO_getArgs_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_isDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_createDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_removeDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_renameDirectory_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_directoryContents_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_removeFile_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_renameFile_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getFileTimestamp_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_getFileSize_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_serverSocket_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Socket_toText

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Handle_toText

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
ThreadId_toText

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_socketPort_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_listen_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_clientSocket_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_closeSocket_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_socketAccept_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_socketSend_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_socketReceive_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
3 ForeignFunc
IO_socketSendBuf_impl_v1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
3 ForeignFunc
IO_socketReceiveBuf_impl_v1

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_kill_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_delay_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_stdHandle

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_process_call

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_process_start

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_process_kill

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_process_wait

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_process_exitCode
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_new

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
MVar_newEmpty_v2

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_take_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_tryTake

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
MVar_put_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
MVar_tryPut_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
MVar_swap_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_isEmpty

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_read_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
MVar_tryRead_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Char_toText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Text_repeat
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_reverse
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_toUppercase
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_toLowercase
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_toUtf8
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_fromUtf8_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_ClientConfig_default
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_ServerConfig_default
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_ClientConfig_certificates_set
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_ServerConfig_certificates_set
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_ClientConfig_certificates_get
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_ServerConfig_certificates_get
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_ClientConfig_validation_disableHostNameValidation
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_ClientConfig_validation_disableCertificateValidation

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
TVar_new

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
TVar_read
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
TVar_write
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
TVar_newIO

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
TVar_readIO
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
TVar_swap
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
STM_retry
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
0 ForeignFunc
Promise_new
  -- the only exceptions from Promise.read are async and shouldn't be caught
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Promise_read
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Promise_tryRead

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Promise_write
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_newClient_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_newServer_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_handshake_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
Tls_send_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_decodeCert_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_encodeCert

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_decodePrivateKey
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_encodePrivateKey

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_receive_impl_v3

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
Tls_terminate_impl_v3
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Code_validateLinks
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Code_dependencies
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Code_serialize
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Code_serialize_versioned
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Code_deserialize
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Code_display
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Value_dependencies
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Value_serialize
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Value_serialize_versioned
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Value_deserialize
  -- Hashing functions
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Sha3_512
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Sha3_256
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Sha2_512
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Sha2_256
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Sha1
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Blake2b_512
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Blake2b_256
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Blake2s_256
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Crypto_HashAlgorithm_Md5

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Crypto_hashBytes
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Crypto_hmacBytes

  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
crypto'hash ForeignFunc
Crypto_hash
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
crypto'hmac ForeignFunc
Crypto_hmac
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Crypto_Ed25519_sign_impl

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Crypto_Ed25519_verify_impl

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Crypto_Rsa_sign_impl

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Crypto_Rsa_verify_impl

  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
murmur'hash ForeignFunc
Universal_murmurHash
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_randomBytes
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_zlib_compress
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_gzip_compress
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_zlib_decompress
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_gzip_decompress

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_toBase16
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_toBase32
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_toBase64
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_toBase64UrlUnpadded

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_fromBase16
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_fromBase32
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_fromBase64
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_fromBase64UrlUnpadded

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat64be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat64le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat32be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat32le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat16be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_decodeNat16le

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat64be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat64le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat32be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat32le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat16be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Bytes_encodeNat16le

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
5 ForeignFunc
MutableArray_copyTo_force

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
5 ForeignFunc
MutableByteArray_copyTo_force

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
5 ForeignFunc
ImmutableArray_copyTo_force

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
ImmutableArray_size
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
MutableArray_size
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
ImmutableByteArray_size
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
MutableByteArray_size

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
5 ForeignFunc
ImmutableByteArray_copyTo_force

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableArray_read
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read8
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read16be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read24be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read32be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read40be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read64be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read16le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read24le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read32le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read40le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
MutableByteArray_read64le

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableArray_write
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write8
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write16be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write32be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write64be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write16le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write32le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_write64le

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableArray_read
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read8
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read16be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read24be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read32be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read40be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read64be
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read16le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read24le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read32le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read40le
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
ImmutableByteArray_read64le

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
MutableByteArray_freeze_force
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
MutableArray_freeze_force

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableByteArray_freeze
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
MutableArray_freeze

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
MutableByteArray_length

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
ImmutableByteArray_length

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
ImmutableByteArray_toBytes
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
ImmutableByteArray_fromBytes

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
PinnedByteArray_cast

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_array
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_arrayOf
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_bytearray
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_bytearrayOf
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
1 ForeignFunc
IO_pinnedByteArray
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Tracked Int
2 ForeignFunc
IO_pinnedByteArrayOf

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Scope_array
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Scope_arrayOf
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Scope_bytearray
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Scope_bytearrayOf
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Scope_pinnedByteArray
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Scope_pinnedByteArrayOf

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_literal
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_digit
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_letter
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_space
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_punctuation
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_anyChar
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Text_patterns_eof
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Text_patterns_charRange
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Text_patterns_notCharRange
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_charIn
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_notCharIn
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_many
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_many_corrected
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_capture
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Pattern_captureAs
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_join
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Pattern_or
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_lookahead
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Pattern_negativeLookahead
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Pattern_replicate

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Pattern_run

  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Pattern_isMatch

  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_any
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Char_Class_not
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Char_Class_and
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Char_Class_or
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Char_Class_range
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Char_Class_anyOf
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_alphanumeric
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_upper
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_lower
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_whitespace
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_control
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_printable
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_mark
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_number
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_punctuation
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_symbol
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_separator
  Sandbox -> ForeignOp -> ForeignFunc -> FDecl Symbol ()
declareForeignWrap Sandbox
Untracked ForeignOp
direct ForeignFunc
Char_Class_letter
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Char_Class_is
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_char
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_lookbehind1
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Text_patterns_negativeLookbehind1

  -- replacements
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Map_insert
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Map_lookup
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Map_fromList
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Map_eq
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Map_union
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Map_intersect
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Map_toList
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
List_range
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
List_sort
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Multimap_fromList
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Set_fromList
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Set_union
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
2 ForeignFunc
Set_intersect
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Set_toList
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Json_toText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Json_unconsText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
1 ForeignFunc
Json_tryUnconsText
  Sandbox -> Int -> ForeignFunc -> FDecl Symbol ()
declareForeign Sandbox
Untracked Int
3 ForeignFunc
Avro_decodeBinary

foreignDeclResults ::
  (Map ForeignFunc (Sandbox, SuperNormal Reference Symbol))
foreignDeclResults :: Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
foreignDeclResults =
  FDecl Symbol ()
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
forall s a. State s a -> s -> s
execState FDecl Symbol ()
declareForeigns Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
forall a. Monoid a => a
mempty

foreignWrappers ::
  [(Data.Text.Text, (Sandbox, SuperNormal Reference Symbol))]
foreignWrappers :: [(Text, (Sandbox, SuperNormal Reference Symbol))]
foreignWrappers =
  Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> [(ForeignFunc, (Sandbox, SuperNormal Reference Symbol))]
forall k a. Map k a -> [(k, a)]
Map.toList Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
foreignDeclResults
    [(ForeignFunc, (Sandbox, SuperNormal Reference Symbol))]
-> ((ForeignFunc, (Sandbox, SuperNormal Reference Symbol))
    -> (Text, (Sandbox, SuperNormal Reference Symbol)))
-> [(Text, (Sandbox, SuperNormal Reference Symbol))]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(ForeignFunc
ff, (Sandbox
sand, SuperNormal Reference Symbol
code)) -> (ForeignFunc -> Text
foreignFuncBuiltinName ForeignFunc
ff, (Sandbox
sand, SuperNormal Reference Symbol
code))

numberedTermLookup :: EnumMap Word64 (SuperNormal Reference Symbol)
numberedTermLookup :: EnumMap Word64 (SuperNormal Reference Symbol)
numberedTermLookup =
  [(Word64, SuperNormal Reference Symbol)]
-> EnumMap Word64 (SuperNormal Reference Symbol)
forall k a. EnumKey k => [(k, a)] -> EnumMap k a
mapFromList ([(Word64, SuperNormal Reference Symbol)]
 -> EnumMap Word64 (SuperNormal Reference Symbol))
-> (Map Reference (Sandbox, SuperNormal Reference Symbol)
    -> [(Word64, SuperNormal Reference Symbol)])
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> EnumMap Word64 (SuperNormal Reference Symbol)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word64]
-> [SuperNormal Reference Symbol]
-> [(Word64, SuperNormal Reference Symbol)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word64
1 ..] ([SuperNormal Reference Symbol]
 -> [(Word64, SuperNormal Reference Symbol)])
-> (Map Reference (Sandbox, SuperNormal Reference Symbol)
    -> [SuperNormal Reference Symbol])
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [(Word64, SuperNormal Reference Symbol)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Reference (SuperNormal Reference Symbol)
-> [SuperNormal Reference Symbol]
forall k a. Map k a -> [a]
Map.elems (Map Reference (SuperNormal Reference Symbol)
 -> [SuperNormal Reference Symbol])
-> (Map Reference (Sandbox, SuperNormal Reference Symbol)
    -> Map Reference (SuperNormal Reference Symbol))
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [SuperNormal Reference Symbol]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Sandbox, SuperNormal Reference Symbol)
 -> SuperNormal Reference Symbol)
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> Map Reference (SuperNormal Reference Symbol)
forall a b. (a -> b) -> Map Reference a -> Map Reference b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Sandbox, SuperNormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a, b) -> b
snd (Map Reference (Sandbox, SuperNormal Reference Symbol)
 -> EnumMap Word64 (SuperNormal Reference Symbol))
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> EnumMap Word64 (SuperNormal Reference Symbol)
forall a b. (a -> b) -> a -> b
$ Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup

builtinTermNumbering :: Map Reference Word64
builtinTermNumbering :: Map Reference Word64
builtinTermNumbering =
  [(Reference, Word64)] -> Map Reference Word64
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([Reference] -> [Word64] -> [(Reference, Word64)]
forall a b. [a] -> [b] -> [(a, b)]
zip (Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [Reference]
forall k a. Map k a -> [k]
Map.keys (Map Reference (Sandbox, SuperNormal Reference Symbol)
 -> [Reference])
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [Reference]
forall a b. (a -> b) -> a -> b
$ Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup) [Word64
1 ..])

builtinTermBackref :: EnumMap Word64 Reference
builtinTermBackref :: EnumMap Word64 Reference
builtinTermBackref =
  [(Word64, Reference)] -> EnumMap Word64 Reference
forall k a. EnumKey k => [(k, a)] -> EnumMap k a
mapFromList ([(Word64, Reference)] -> EnumMap Word64 Reference)
-> (Map Reference (Sandbox, SuperNormal Reference Symbol)
    -> [(Word64, Reference)])
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> EnumMap Word64 Reference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Word64] -> [Reference] -> [(Word64, Reference)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Word64
1 ..] ([Reference] -> [(Word64, Reference)])
-> (Map Reference (Sandbox, SuperNormal Reference Symbol)
    -> [Reference])
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [(Word64, Reference)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [Reference]
forall k a. Map k a -> [k]
Map.keys (Map Reference (Sandbox, SuperNormal Reference Symbol)
 -> EnumMap Word64 Reference)
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> EnumMap Word64 Reference
forall a b. (a -> b) -> a -> b
$ Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup

builtinForeignNames :: Map ForeignFunc Data.Text.Text
builtinForeignNames :: Map ForeignFunc Text
builtinForeignNames =
  Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
foreignDeclResults
    Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> (Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
    -> [ForeignFunc])
-> [ForeignFunc]
forall a b. a -> (a -> b) -> b
& Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> [ForeignFunc]
forall k a. Map k a -> [k]
Map.keys
    [ForeignFunc]
-> ([ForeignFunc] -> [(ForeignFunc, Text)])
-> [(ForeignFunc, Text)]
forall a b. a -> (a -> b) -> b
& (ForeignFunc -> (ForeignFunc, Text))
-> [ForeignFunc] -> [(ForeignFunc, Text)]
forall a b. (a -> b) -> [a] -> [b]
map (\ForeignFunc
f -> (ForeignFunc
f, ForeignFunc -> Text
foreignFuncBuiltinName ForeignFunc
f))
    [(ForeignFunc, Text)]
-> ([(ForeignFunc, Text)] -> Map ForeignFunc Text)
-> Map ForeignFunc Text
forall a b. a -> (a -> b) -> b
& [(ForeignFunc, Text)] -> Map ForeignFunc Text
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList

-- Bootstrapping for sandbox check. The eventual map will be one with
-- associations `r -> s` where `s` is all the 'sensitive' base
-- functions that `r` calls.
baseSandboxInfo :: Map Reference (Set Reference)
baseSandboxInfo :: Map Reference (Set Reference)
baseSandboxInfo =
  [(Reference, Set Reference)] -> Map Reference (Set Reference)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Reference, Set Reference)] -> Map Reference (Set Reference))
-> [(Reference, Set Reference)] -> Map Reference (Set Reference)
forall a b. (a -> b) -> a -> b
$
    [ (Reference
r, Reference -> Set Reference
forall a. a -> Set a
Set.singleton Reference
r)
      | (Reference
r, (Sandbox
sb, SuperNormal Reference Symbol
_)) <- Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [(Reference, (Sandbox, SuperNormal Reference Symbol))]
forall k a. Map k a -> [(k, a)]
Map.toList Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup,
        Sandbox
sb Sandbox -> Sandbox -> Bool
forall a. Eq a => a -> a -> Bool
== Sandbox
Tracked
    ]

builtinArities :: Map Reference Int
builtinArities :: Map Reference Int
builtinArities =
  [(Reference, Int)] -> Map Reference Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Reference, Int)] -> Map Reference Int)
-> [(Reference, Int)] -> Map Reference Int
forall a b. (a -> b) -> a -> b
$
    [(Reference
r, SuperNormal Reference Symbol -> Int
forall ref v. SuperNormal ref v -> Int
arity SuperNormal Reference Symbol
s) | (Reference
r, (Sandbox
_, SuperNormal Reference Symbol
s)) <- Map Reference (Sandbox, SuperNormal Reference Symbol)
-> [(Reference, (Sandbox, SuperNormal Reference Symbol))]
forall k a. Map k a -> [(k, a)]
Map.toList Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup]

builtinOptInfo :: ANF.OptInfos Reference Symbol
builtinOptInfo :: OptInfos Reference Symbol
builtinOptInfo =
  Map Reference (SuperGroup Reference Symbol)
-> OptInfos Reference Symbol
forall v ref. Var v => Map ref (SuperGroup ref v) -> OptInfos ref v
ANF.buildOptInfos (Map Reference (SuperGroup Reference Symbol)
 -> OptInfos Reference Symbol)
-> Map Reference (SuperGroup Reference Symbol)
-> OptInfos Reference Symbol
forall a b. (a -> b) -> a -> b
$ ((Sandbox, SuperNormal Reference Symbol)
 -> SuperGroup Reference Symbol)
-> Map Reference (Sandbox, SuperNormal Reference Symbol)
-> Map Reference (SuperGroup Reference Symbol)
forall a b. (a -> b) -> Map Reference a -> Map Reference b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ([(Symbol, SuperNormal Reference Symbol)]
-> SuperNormal Reference Symbol -> SuperGroup Reference Symbol
forall ref v.
[(v, SuperNormal ref v)] -> SuperNormal ref v -> SuperGroup ref v
Rec [] (SuperNormal Reference Symbol -> SuperGroup Reference Symbol)
-> ((Sandbox, SuperNormal Reference Symbol)
    -> SuperNormal Reference Symbol)
-> (Sandbox, SuperNormal Reference Symbol)
-> SuperGroup Reference Symbol
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sandbox, SuperNormal Reference Symbol)
-> SuperNormal Reference Symbol
forall a b. (a, b) -> b
snd) Map Reference (Sandbox, SuperNormal Reference Symbol)
builtinLookup

sandboxedForeignFuncs :: Set ForeignFunc
sandboxedForeignFuncs :: Set ForeignFunc
sandboxedForeignFuncs =
  Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> Set ForeignFunc
forall k a. Map k a -> Set k
Map.keysSet (Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
 -> Set ForeignFunc)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> Set ForeignFunc
forall a b. (a -> b) -> a -> b
$
    ((Sandbox, SuperNormal Reference Symbol) -> Bool)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
-> Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
forall a k. (a -> Bool) -> Map k a -> Map k a
Map.filter (\(Sandbox
sb, SuperNormal Reference Symbol
_) -> Sandbox
sb Sandbox -> Sandbox -> Bool
forall a. Eq a => a -> a -> Bool
== Sandbox
Tracked) Map ForeignFunc (Sandbox, SuperNormal Reference Symbol)
foreignDeclResults