Merge remote-tracking branch 'origin/trunk' into topic/builtins-misc

This commit is contained in:
Dan Doel 2023-01-26 10:30:05 -05:00
commit 9e0e93135f
25 changed files with 563 additions and 340 deletions

View File

@ -5,6 +5,7 @@
* [`UNISON_DEBUG`](#unison_debug)
* [`UNISON_PAGER`](#unison_pager)
* [`UNISON_LSP_PORT`](#unison_lsp_port)
* [`UNISON_LSP_ENABLED`](#unison_lsp_enabled)
* [`UNISON_SHARE_HOST`](#unison_share_host)
* [`UNISON_SHARE_ACCESS_TOKEN`](#unison_share_access_token)
* [Local Codebase Server](#local-codebase-server)
@ -50,6 +51,31 @@ E.g.
$ UNISON_LSP_PORT=8080 ucm
```
### `UNISON_LSP_ENABLED`
Allows explicitly enabling or disabling the LSP server.
Acceptable values are 'true' or 'false'
Note for Windows users: Due to an outstanding issue with GHC's IO manager on Windows, the LSP is **disabled by default** on Windows machines.
Enabling the LSP on windows can cause UCM to hang on exit and may require the process to be killed by the operating system or via Ctrl-C.
Note that this doesn't pose any risk of codebase corruption or cause any known issues, it's simply an annoyance.
If you accept this annoyance, you can enable the LSP server on Windows by exporting the `UNISON_LSP_ENABLED=true` environment variable.
You can set this persistently in powershell using:
```powershell
[System.Environment]::SetEnvironmentVariable('UNISON_LSP_ENABLED','true')
```
See [this issue](https://github.com/unisonweb/unison/issues/3487) for more details.
E.g.
```sh
$ UNISON_LSP_ENABLED=true ucm
```
### `UNISON_SHARE_HOST`
Allows selecting the location for the default Share server.

View File

@ -20,6 +20,19 @@ Currently the only supported configuration is to connect to the LSP via a specif
By default the LSP is hosted at `127.0.0.1:5757`, but you can change the port using `UNISON_LSP_PORT=1234`.
Note for Windows users: Due to an outstanding issue with GHC's IO manager on Windows, the LSP is **disabled by default** on Windows machines.
Enabling the LSP on windows can cause UCM to hang on exit and may require the process to be killed by the operating system or via Ctrl-C.
Note that this doesn't pose any risk of codebase corruption or cause any known issues, it's simply an annoyance.
If you accept this annoyance, you can enable the LSP server on Windows by exporting the `UNISON_LSP_ENABLED=true` environment variable.
You can set this persistently in powershell using:
```powershell
[System.Environment]::SetEnvironmentVariable('UNISON_LSP_ENABLED','true')
```
See [this issue](https://github.com/unisonweb/unison/issues/3487) for more details.
### NeoVim

View File

@ -70,6 +70,7 @@ dependencies:
- monad-validate
- mtl
- mutable-containers
- murmur-hash
- mwc-random
- natural-transformation
- network

View File

@ -455,6 +455,7 @@ builtinsSrc =
B "Universal.<" $ forall1 "a" (\a -> a --> a --> boolean),
B "Universal.>=" $ forall1 "a" (\a -> a --> a --> boolean),
B "Universal.<=" $ forall1 "a" (\a -> a --> a --> boolean),
B "Universal.murmurHash" $ forall1 "a" (\a -> a --> nat),
B "bug" $ forall1 "a" (\a -> forall1 "b" (\b -> a --> b)),
B "todo" $ forall1 "a" (\a -> forall1 "b" (\b -> a --> b)),
B "Any.Any" $ forall1 "a" (\a -> a --> anyt),

View File

@ -17,7 +17,7 @@ import qualified Data.Text as Text
import Data.Void (Void)
import qualified Text.Megaparsec as P
import qualified Unison.ABT as ABT
import Unison.Builtin.Decls (pattern TupleType', unitRef)
import Unison.Builtin.Decls (unitRef, pattern TupleType')
import qualified Unison.Codebase.Path as Path
import Unison.ConstructorReference (ConstructorReference, GConstructorReference (..))
import Unison.HashQualified (HashQualified)
@ -400,17 +400,20 @@ renderTypeError e env src curPath = case e of
],
debugSummary note
]
where
unitHintMsg =
"\nHint: Actions within a block must have type " <>
style Type2 (renderType' env expectedLeaf) <> ".\n" <>
" Use " <> style Type1 "_ = <expr>" <> " to ignore a result."
unitHint = if giveUnitHint then unitHintMsg else ""
giveUnitHint = case expectedType of
Type.Ref' u | u == unitRef -> case mismatchSite of
Term.Let1Named' v _ _ -> Var.isAction v
_ -> False
where
unitHintMsg =
"\nHint: Actions within a block must have type "
<> style Type2 (renderType' env expectedLeaf)
<> ".\n"
<> " Use "
<> style Type1 "_ = <expr>"
<> " to ignore a result."
unitHint = if giveUnitHint then unitHintMsg else ""
giveUnitHint = case expectedType of
Type.Ref' u | u == unitRef -> case mismatchSite of
Term.Let1Named' v _ _ -> Var.isAction v
_ -> False
_ -> False
AbilityCheckFailure {..}
| [tv@(Type.Var' ev)] <- ambient,
ev `Set.member` foldMap Type.freeVars requested ->
@ -1637,7 +1640,7 @@ renderParseErrors s = \case
<> style ErrorSite "match"
<> "/"
<> style ErrorSite "with"
<> " but I didn't find any."
<> " or cases but I didn't find any."
),
"",
tokenAsErrorSite s tok

View File

@ -36,6 +36,7 @@ import Control.Monad.Catch (MonadCatch)
import qualified Control.Monad.Primitive as PA
import Control.Monad.Reader (ReaderT (..), ask, runReaderT)
import Control.Monad.State.Strict (State, execState, modify)
import Data.Digest.Murmur64 (hash64, asWord64)
import qualified Crypto.Hash as Hash
import qualified Crypto.MAC.HMAC as HMAC
import Data.Bits (shiftL, shiftR, (.|.))
@ -1108,6 +1109,17 @@ crypto'hash instr =
where
(alg, x, vl) = fresh
murmur'hash :: ForeignOp
murmur'hash instr =
([BX],)
. TAbss [x]
. TLetD vl BX (TPrm VALU [x])
. TLetD result UN (TFOp instr [vl])
$ TCon Ty.natRef 0 [result]
where
(x, vl, result) = fresh
crypto'hmac :: ForeignOp
crypto'hmac instr =
([BX, BX, BX],)
@ -2627,6 +2639,9 @@ declareForeigns = do
Left se -> Left (Util.Text.pack (show se))
Right a -> Right a
declareForeign Untracked "Universal.murmurHash" murmur'hash . mkForeign $
pure . asWord64 . hash64 . serializeValueLazy
declareForeign Untracked "Bytes.zlib.compress" boxDirect . mkForeign $ pure . Bytes.zlibCompress
declareForeign Untracked "Bytes.gzip.compress" boxDirect . mkForeign $ pure . Bytes.gzipCompress
declareForeign Untracked "Bytes.zlib.decompress" boxToEBoxBox . mkForeign $ \bs ->

View File

@ -143,7 +143,7 @@ match = do
matchCases1 :: Var v => L.Token () -> P v (NonEmpty (Int, Term.MatchCase Ann (Term v Ann)))
matchCases1 start = do
cases <-
sepBy1 semi matchCase
(sepBy semi matchCase)
<&> \cases -> [(n, c) | (n, cs) <- cases, c <- cs]
case cases of
[] -> P.customFailure (EmptyMatch start)
@ -161,27 +161,33 @@ matchCases1 start = do
-- (42, x) -> ...
matchCase :: Var v => P v (Int, [Term.MatchCase Ann (Term v Ann)])
matchCase = do
pats <- sepBy1 (reserved ",") parsePattern
pats <- sepBy1 (label "\",\"" $ reserved ",") parsePattern
let boundVars' = [v | (_, vs) <- pats, (_ann, v) <- vs]
pat = case fst <$> pats of
[p] -> p
pats -> foldr pair (unit (ann . last $ pats)) pats
unit ann = Pattern.Constructor ann (ConstructorReference DD.unitRef 0) []
pair p1 p2 = Pattern.Constructor (ann p1 <> ann p2) (ConstructorReference DD.pairRef 0) [p1, p2]
guardsAndBlocks <- many $ do
guard <-
asum
[ Nothing <$ P.try (reserved "|" *> quasikeyword "otherwise"),
optional $ reserved "|" *> infixAppOrBooleanOp
]
t <- block "->"
pure (guard, t)
let guardedBlocks = label "pattern guard" . some $ do
reserved "|"
guard <-
asum
[ Nothing <$ P.try (quasikeyword "otherwise"),
Just <$> infixAppOrBooleanOp
]
t <- block "->"
pure (guard, t)
let unguardedBlock = label "case match" $ do
t <- block "->"
pure (Nothing, t)
-- a pattern's RHS is either one or more guards, or a single unguarded block.
guardsAndBlocks <- guardedBlocks <|> (pure @[] <$> unguardedBlock)
let absChain vs t = foldr (\v t -> ABT.abs' (ann t) v t) t vs
let mk (guard, t) = Term.MatchCase pat (fmap (absChain boundVars') guard) (absChain boundVars' t)
pure $ (length pats, mk <$> guardsAndBlocks)
parsePattern :: forall v. Var v => P v (Pattern Ann, [(Ann, v)])
parsePattern = root
parsePattern = label "pattern" root
where
root = chainl1 patternCandidates patternInfixApp
patternCandidates = constructor <|> leaf

View File

@ -239,6 +239,7 @@ library
, mmorph
, monad-validate
, mtl
, murmur-hash
, mutable-containers
, mwc-random
, natural-transformation
@ -428,6 +429,7 @@ test-suite parser-typechecker-tests
, mmorph
, monad-validate
, mtl
, murmur-hash
, mutable-containers
, mwc-random
, natural-transformation

View File

@ -7,7 +7,9 @@ module Unison.LSP where
import Colog.Core (LogAction (LogAction))
import qualified Colog.Core as Colog
import Compat (onWindows)
import Control.Monad.Reader
import Data.Char (toLower)
import GHC.IO.Exception (ioe_errno)
import qualified Ki
import qualified Language.LSP.Logging as LSP
@ -19,6 +21,7 @@ import Language.LSP.VFS
import qualified Network.Simple.TCP as TCP
import Network.Socket (socketToHandle)
import System.Environment (lookupEnv)
import System.IO (hPutStrLn)
import Unison.Codebase
import Unison.Codebase.Branch (Branch)
import qualified Unison.Codebase.Path as Path
@ -49,17 +52,18 @@ getLspPort = fromMaybe "5757" <$> lookupEnv "UNISON_LSP_PORT"
-- | Spawn an LSP server on the configured port.
spawnLsp :: Codebase IO Symbol Ann -> Runtime Symbol -> STM (Branch IO) -> STM (Path.Absolute) -> IO ()
spawnLsp codebase runtime latestBranch latestPath = TCP.withSocketsDo do
lspPort <- getLspPort
UnliftIO.handleIO (handleFailure lspPort) $ do
TCP.serve (TCP.Host "127.0.0.1") lspPort $ \(sock, _sockaddr) -> do
Ki.scoped \scope -> do
sockHandle <- socketToHandle sock ReadWriteMode
-- currently we have an independent VFS for each LSP client since each client might have
-- different un-saved state for the same file.
initVFS $ \vfs -> do
vfsVar <- newMVar vfs
void $ runServerWithHandles lspServerLogger lspClientLogger sockHandle sockHandle (serverDefinition vfsVar codebase runtime scope latestBranch latestPath)
spawnLsp codebase runtime latestBranch latestPath =
ifEnabled . TCP.withSocketsDo $ do
lspPort <- getLspPort
UnliftIO.handleIO (handleFailure lspPort) $ do
TCP.serve (TCP.Host "127.0.0.1") lspPort $ \(sock, _sockaddr) -> do
Ki.scoped \scope -> do
sockHandle <- socketToHandle sock ReadWriteMode
-- currently we have an independent VFS for each LSP client since each client might have
-- different un-saved state for the same file.
initVFS $ \vfs -> do
vfsVar <- newMVar vfs
void $ runServerWithHandles lspServerLogger lspClientLogger sockHandle sockHandle (serverDefinition vfsVar codebase runtime scope latestBranch latestPath)
where
handleFailure :: String -> IOException -> IO ()
handleFailure lspPort ioerr =
@ -75,6 +79,14 @@ spawnLsp codebase runtime latestBranch latestPath = TCP.withSocketsDo do
lspServerLogger = Colog.filterBySeverity Colog.Error Colog.getSeverity $ Colog.cmap (fmap tShow) (LogAction print)
-- Where to send logs that occur after a client connects
lspClientLogger = Colog.cmap (fmap tShow) LSP.defaultClientLogger
ifEnabled :: IO () -> IO ()
ifEnabled runServer = do
-- Default LSP to disabled on Windows unless explicitly enabled
lookupEnv "UNISON_LSP_ENABLED" >>= \case
Just (fmap toLower -> "false") -> pure ()
Just (fmap toLower -> "true") -> runServer
Just x -> hPutStrLn stderr $ "Invalid value for UNISON_LSP_ENABLED, expected 'true' or 'false' but found: " <> x
Nothing -> when (not onWindows) runServer
serverDefinition ::
MVar VFS ->

View File

@ -31,6 +31,7 @@ hoverHandler m respond =
results <- MaybeT . fmap eitherToMaybe $ (lspBackend $ Backend.prettyDefinitionsForHQName Path.empty Nothing Nothing (Backend.Suffixify True) rt cb hqIdentifier)
let termResults = formatTermDefinition <$> toList (Backend.termDefinitions results)
let typeResults = formatTypeDefinition <$> toList (Backend.typeDefinitions results)
guard (not . null $ termResults <> typeResults)
let markup = Text.intercalate "\n\n---\n\n" $ termResults <> typeResults
pure $
Hover

View File

@ -22,7 +22,7 @@ import ArgParse
UsageRenderer,
parseCLIArgs,
)
import Compat (defaultInterruptHandler, onWindows, withInterruptHandler)
import Compat (defaultInterruptHandler, withInterruptHandler)
import Control.Concurrent (newEmptyMVar, runInUnboundThread, takeMVar)
import Control.Concurrent.STM
import Control.Error.Safe (rightMay)
@ -264,7 +264,7 @@ main = withCP65001 . runInUnboundThread . Ki.scoped $ \scope -> do
-- prevent UCM from shutting down properly. Hopefully we can re-enable LSP on
-- Windows when we move to GHC 9.*
-- https://gitlab.haskell.org/ghc/ghc/-/merge_requests/1224
when (not onWindows) . void . Ki.fork scope $ LSP.spawnLsp theCodebase runtime (readTMVar rootVar) (readTVar pathVar)
void . Ki.fork scope $ LSP.spawnLsp theCodebase runtime (readTMVar rootVar) (readTVar pathVar)
Server.startServer (Backend.BackendEnv {Backend.useNamesIndex = False}) codebaseServerOpts sbRuntime theCodebase $ \baseUrl -> do
case exitOption of
DoNotExit -> do

View File

@ -2358,62 +2358,65 @@ This transcript is intended to make visible accidental changes to the hashing al
672. -- ##Universal.compare
builtin.Universal.compare : a -> a -> Int
673. -- ##unsafe.coerceAbilities
673. -- ##Universal.murmurHash
builtin.Universal.murmurHash : a -> Nat
674. -- ##unsafe.coerceAbilities
builtin.unsafe.coerceAbilities : (a ->{e1} b)
-> a
->{e2} b
674. -- ##Value
675. -- ##Value
builtin type builtin.Value
675. -- ##Value.dependencies
676. -- ##Value.dependencies
builtin.Value.dependencies : Value -> [Link.Term]
676. -- ##Value.deserialize
677. -- ##Value.deserialize
builtin.Value.deserialize : Bytes -> Either Text Value
677. -- ##Value.load
678. -- ##Value.load
builtin.Value.load : Value ->{IO} Either [Link.Term] a
678. -- ##Value.serialize
679. -- ##Value.serialize
builtin.Value.serialize : Value -> Bytes
679. -- ##Value.value
680. -- ##Value.value
builtin.Value.value : a -> Value
680. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo
681. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo
unique type builtin.Year
681. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo#0
682. -- #dem6aglnj8cppfrnq9qipl7geo5pim3auo9cmv1rhh5la9edalj19sspbpm1pd4vh0plokdh6qfo48gs034dqlg0s7j9fhr9p9ndtpo#0
builtin.Year.Year : Nat -> Year
682. -- #k0rcrut9836hr3sevkivq4n2o3t540hllesila69b16gr5fcqe0i6aepqhv2qmso6h22lbipbp3fto0oc8o73l1lvf6vpifi01gmhg8
683. -- #k0rcrut9836hr3sevkivq4n2o3t540hllesila69b16gr5fcqe0i6aepqhv2qmso6h22lbipbp3fto0oc8o73l1lvf6vpifi01gmhg8
cache : [(Link.Term, Code)] ->{IO, Exception} ()
683. -- #okolgrio28p1mbl1bfjfs9qtsr1m9upblcm3ul872gcir6epkcbq619vk5bdq1fnr371nelsof6jsp8469g4j6f0gg3007p79o4kf18
684. -- #okolgrio28p1mbl1bfjfs9qtsr1m9upblcm3ul872gcir6epkcbq619vk5bdq1fnr371nelsof6jsp8469g4j6f0gg3007p79o4kf18
check : Text -> Boolean ->{Stream Result} ()
684. -- #je42vk6rsefjlup01e1fmmdssf5i3ba9l6aka3bipggetfm8o4i8d1q5d7hddggu5jure1bu5ot8aq5in31to4788ctrtpb44ri83r8
685. -- #je42vk6rsefjlup01e1fmmdssf5i3ba9l6aka3bipggetfm8o4i8d1q5d7hddggu5jure1bu5ot8aq5in31to4788ctrtpb44ri83r8
checks : [Boolean] -> [Result]
685. -- #barg6v1n15ea1qhp80i77gjjq3vu1noc67q2jkv9n6n5v0c9djup70ltauujgpfe0kuo8ckd20gc9kutngdpb8d22rubtb5rjldrb3o
686. -- #barg6v1n15ea1qhp80i77gjjq3vu1noc67q2jkv9n6n5v0c9djup70ltauujgpfe0kuo8ckd20gc9kutngdpb8d22rubtb5rjldrb3o
clientSocket : Text -> Text ->{IO, Exception} Socket
686. -- #lg7i12ido0jr43ovdbhhv2enpk5ar869leouri5qhrivinde93nl86s2rgshubtfhlogbe310k3rluotscmus9moo1tvpn0nmp1efv8
687. -- #lg7i12ido0jr43ovdbhhv2enpk5ar869leouri5qhrivinde93nl86s2rgshubtfhlogbe310k3rluotscmus9moo1tvpn0nmp1efv8
closeFile : Handle ->{IO, Exception} ()
687. -- #4e6qn65v05l32n380lpf536u4llnp6f6tvvt13hvo0bhqeh3f3i8bquekc120c8h59gld1mf02ok0sje7037ipg1fsu97fqrm01oi00
688. -- #4e6qn65v05l32n380lpf536u4llnp6f6tvvt13hvo0bhqeh3f3i8bquekc120c8h59gld1mf02ok0sje7037ipg1fsu97fqrm01oi00
closeSocket : Socket ->{IO, Exception} ()
688. -- #7o1e77u808vpg8i6k1mvutg8h6tdr14hegfad23e9sjou1ft10kvfr95goo0kv2ldqlsaa4pmvdl8d7jd6h252i3jija05b4vpqbg5g
689. -- #7o1e77u808vpg8i6k1mvutg8h6tdr14hegfad23e9sjou1ft10kvfr95goo0kv2ldqlsaa4pmvdl8d7jd6h252i3jija05b4vpqbg5g
Code.transitiveDeps : Link.Term
->{IO} [(Link.Term, Code)]
689. -- #sfud7h76up0cofgk61b7tf8rhdlugfmg44lksnpglfes1b8po26si7betka39r9j8dpgueorjdrb1i7v4g62m5bci1e971eqi8dblmo
690. -- #sfud7h76up0cofgk61b7tf8rhdlugfmg44lksnpglfes1b8po26si7betka39r9j8dpgueorjdrb1i7v4g62m5bci1e971eqi8dblmo
compose : ∀ o g1 i1 g i.
(i1 ->{g1} o) -> (i ->{g} i1) -> i ->{g1, g} o
690. -- #b0tsob9a3fegn5dkb57jh15smd7ho2qo78st6qngpa7a8hc88mccl7vhido41o4otokv5l8hjdj3nabtkmpni5ikeatd44agmqbhano
691. -- #b0tsob9a3fegn5dkb57jh15smd7ho2qo78st6qngpa7a8hc88mccl7vhido41o4otokv5l8hjdj3nabtkmpni5ikeatd44agmqbhano
compose2 : ∀ o g2 i2 g1 g i i1.
(i2 ->{g2} o)
-> (i1 ->{g1} i ->{g} i2)
@ -2421,7 +2424,7 @@ This transcript is intended to make visible accidental changes to the hashing al
-> i
->{g2, g1, g} o
691. -- #m632ocgh2rougfejkddsso3vfpf4dmg1f8bhf0k6sha4g4aqfmbeuct3eo0je6dv9utterfvotjdu32p0kojuo9fj4qkp2g1bt464eg
692. -- #m632ocgh2rougfejkddsso3vfpf4dmg1f8bhf0k6sha4g4aqfmbeuct3eo0je6dv9utterfvotjdu32p0kojuo9fj4qkp2g1bt464eg
compose3 : ∀ o g3 i3 g2 g1 g i i1 i2.
(i3 ->{g3} o)
-> (i2 ->{g2} i1 ->{g1} i ->{g} i3)
@ -2430,318 +2433,318 @@ This transcript is intended to make visible accidental changes to the hashing al
-> i
->{g3, g2, g1, g} o
692. -- #ilkeid6l866bmq90d2v1ilqp9dsjo6ucmf8udgrokq3nr3mo9skl2vao2mo7ish136as52rsf19u9v3jkmd85bl08gnmamo4e5v2fqo
693. -- #ilkeid6l866bmq90d2v1ilqp9dsjo6ucmf8udgrokq3nr3mo9skl2vao2mo7ish136as52rsf19u9v3jkmd85bl08gnmamo4e5v2fqo
contains : Text -> Text -> Boolean
693. -- #tgvna0i8ea98jvnd2oka85cdtas1prcbq3snvc4qfns6082mlckps2cspk8jln11mklg19bna025tog5m9sb671o27ujsa90lfrbnkg
694. -- #tgvna0i8ea98jvnd2oka85cdtas1prcbq3snvc4qfns6082mlckps2cspk8jln11mklg19bna025tog5m9sb671o27ujsa90lfrbnkg
crawl : [(Link.Term, Code)]
-> [Link.Term]
->{IO} [(Link.Term, Code)]
694. -- #o0qn048fk7tjb8e7d54vq5mg9egr5kophb9pcm0to4aj0kf39mv76c6olsm27vj309d7nhjh4nps7098fpvqe8j5cfg01ghf3bnju90
695. -- #o0qn048fk7tjb8e7d54vq5mg9egr5kophb9pcm0to4aj0kf39mv76c6olsm27vj309d7nhjh4nps7098fpvqe8j5cfg01ghf3bnju90
createTempDirectory : Text ->{IO, Exception} Text
695. -- #4858f4krb9l4ot1hml21j48lp3bcvbo8b9unlk33b9a3ovu1jrbr1k56pnfhffkiu1bht2ovh0i82nn5jnoc5s5ru85qvua0m2ol43g
696. -- #4858f4krb9l4ot1hml21j48lp3bcvbo8b9unlk33b9a3ovu1jrbr1k56pnfhffkiu1bht2ovh0i82nn5jnoc5s5ru85qvua0m2ol43g
decodeCert : Bytes ->{Exception} SignedCert
696. -- #ihbmfc4r7o3391jocjm6v4mojpp3hvt84ivqigrmp34vb5l3d7mmdlvh3hkrtebi812npso7rqo203a59pbs7r2g78ig6jvsv0nva38
697. -- #ihbmfc4r7o3391jocjm6v4mojpp3hvt84ivqigrmp34vb5l3d7mmdlvh3hkrtebi812npso7rqo203a59pbs7r2g78ig6jvsv0nva38
delay : Nat ->{IO, Exception} ()
697. -- #dsen29k7605pkfquesnaphhmlm3pjkfgm7m2oc90m53gqvob4l39p4g3id3pirl8emg5tcdmr81ctl3lk1enm52mldlfmlh1i85rjbg
698. -- #dsen29k7605pkfquesnaphhmlm3pjkfgm7m2oc90m53gqvob4l39p4g3id3pirl8emg5tcdmr81ctl3lk1enm52mldlfmlh1i85rjbg
directoryContents : Text ->{IO, Exception} [Text]
698. -- #b22tpqhkq6kvt27dcsddnbfci2bcqutvhmumdven9c5psiilboq2mb8v9ekihtkl6mkartd5ml5u75u84v850n29l91de63lkg3ud38
699. -- #b22tpqhkq6kvt27dcsddnbfci2bcqutvhmumdven9c5psiilboq2mb8v9ekihtkl6mkartd5ml5u75u84v850n29l91de63lkg3ud38
Either.isLeft : Either a b -> Boolean
699. -- #i1ec3csomb1pegm9r7ppabunabb7cq1t6bb6cvqtt72nd01jot7gde2mak288cbml910abbtho0smsbq17b2r33j599b0vuv7je04j8
700. -- #i1ec3csomb1pegm9r7ppabunabb7cq1t6bb6cvqtt72nd01jot7gde2mak288cbml910abbtho0smsbq17b2r33j599b0vuv7je04j8
Either.mapLeft : (i ->{g} o)
-> Either i b
->{g} Either o b
700. -- #f765l0pa2tb9ieciivum76s7bp8rdjr8j7i635jjenj9tacgba9eeomur4vv3uuh4kem1pggpmrn61a1e3im9g90okcm13r192f7alg
701. -- #f765l0pa2tb9ieciivum76s7bp8rdjr8j7i635jjenj9tacgba9eeomur4vv3uuh4kem1pggpmrn61a1e3im9g90okcm13r192f7alg
Either.raiseMessage : v -> Either Text b ->{Exception} b
701. -- #9hifem8o2e1g7tdh4om9kfo98ifr60gfmdp8ci58djn17epm1b4m6idli8b373bsrg487n87n4l50ksq76avlrbh9q2jpobkk18ucvg
702. -- #9hifem8o2e1g7tdh4om9kfo98ifr60gfmdp8ci58djn17epm1b4m6idli8b373bsrg487n87n4l50ksq76avlrbh9q2jpobkk18ucvg
evalTest : '{IO, TempDirs, Exception, Stream Result} a
->{IO, Exception} ([Result], a)
702. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng
703. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng
structural ability Exception
structural ability builtin.Exception
703. -- #t20uuuiil07o22les8gv4sji7ju5esevloamnja3bjkrh2f250lgitv6595l6hlc2q64c1om0hhjqgter28dtnibb0dkr2j7e3ss530
704. -- #t20uuuiil07o22les8gv4sji7ju5esevloamnja3bjkrh2f250lgitv6595l6hlc2q64c1om0hhjqgter28dtnibb0dkr2j7e3ss530
Exception.catch : '{g, Exception} a
->{g} Either Failure a
704. -- #hbhvk2e00l6o7qhn8e7p6dc36bjl7ljm0gn2df5clidlrdoufsig1gt5pjhg72kl67folgg2b892kh9jc1oh0l79h4p8dqhcf1tkde0
705. -- #hbhvk2e00l6o7qhn8e7p6dc36bjl7ljm0gn2df5clidlrdoufsig1gt5pjhg72kl67folgg2b892kh9jc1oh0l79h4p8dqhcf1tkde0
Exception.failure : Text -> a -> Failure
705. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0
706. -- #4n0fgs00hpsj3paqnm9bfm4nbt9cbrin3hl88i992m9tjiq1ik7eq72asu4hcg885uti36tbnj5rudt56eahhnut1nobofg86pk1bng#0
Exception.raise,
builtin.Exception.raise : Failure
->{Exception} x
706. -- #5mqjoauctm02dlqdc10cc66relu40997d6o1u8fj7vv7g0i2mtacjc83afqhuekll1gkqr9vv4lq7aenanq4kf53kcce4l1srr6ip08
707. -- #5mqjoauctm02dlqdc10cc66relu40997d6o1u8fj7vv7g0i2mtacjc83afqhuekll1gkqr9vv4lq7aenanq4kf53kcce4l1srr6ip08
Exception.reraise : Either Failure a ->{Exception} a
707. -- #1f774ia7im9i0cfp7l5a1g9tkvnd4m2940ga3buaf4ekd43dr1289vknghjjvi4qtevh7s61p5s573gpli51qh7e0i5pj9ggmeb69d0
708. -- #1f774ia7im9i0cfp7l5a1g9tkvnd4m2940ga3buaf4ekd43dr1289vknghjjvi4qtevh7s61p5s573gpli51qh7e0i5pj9ggmeb69d0
Exception.toEither : '{ε, Exception} a
->{ε} Either Failure a
708. -- #li2h4hncbgmfi5scuah06rtdt8rjcipiv2t95hos15ol63usv78ti3vng7o9862a70906rum7nrrs9qd9q8iqu1rdcfe292r0al7n38
709. -- #li2h4hncbgmfi5scuah06rtdt8rjcipiv2t95hos15ol63usv78ti3vng7o9862a70906rum7nrrs9qd9q8iqu1rdcfe292r0al7n38
Exception.toEither.handler : Request {Exception} a
-> Either Failure a
709. -- #5fi0ep8mufag822f18ukaffakrmm3ddg8a83dkj4gh2ks4e2c60sk9s8pmk92p69bvkcflql3rgoalp8ruth7fapqrks3kbmdl61b00
710. -- #5fi0ep8mufag822f18ukaffakrmm3ddg8a83dkj4gh2ks4e2c60sk9s8pmk92p69bvkcflql3rgoalp8ruth7fapqrks3kbmdl61b00
Exception.unsafeRun! : '{g, Exception} a ->{g} a
710. -- #qdcih6h4dmf9a2tn2ndvn0br9ef41ubhcniadou1m6ro641gm2tn79m6boh5sr4q271oiui6ehbdqe53r0gobdeagotkjr67kieq3ro
711. -- #qdcih6h4dmf9a2tn2ndvn0br9ef41ubhcniadou1m6ro641gm2tn79m6boh5sr4q271oiui6ehbdqe53r0gobdeagotkjr67kieq3ro
expect : Text
-> (a -> a -> Boolean)
-> a
-> a
->{Stream Result} ()
711. -- #ngmnbge6f7nkehkkhj6rkit60rp3qlt0vij33itch1el3ta2ukrit4gvpn2n0j0s43sj9af53kphgs0h2n65bnqcr9pmasud2r7klsg
712. -- #ngmnbge6f7nkehkkhj6rkit60rp3qlt0vij33itch1el3ta2ukrit4gvpn2n0j0s43sj9af53kphgs0h2n65bnqcr9pmasud2r7klsg
expectU : Text -> a -> a ->{Stream Result} ()
712. -- #f54plhut9f6mg77r1f033vubik89irq1eri79d5pd6mqi03rq9em99mc90plurvjnmvho73ssof5fvndgmcg4fgrpvuuil7hb5qmebo
713. -- #f54plhut9f6mg77r1f033vubik89irq1eri79d5pd6mqi03rq9em99mc90plurvjnmvho73ssof5fvndgmcg4fgrpvuuil7hb5qmebo
fail : Text -> b ->{Exception} c
713. -- #mpe805fs330vqp5l5mg73deahken20dub4hrfvmuutfo97dikgagvimncfr6mfp1l24bjqes1m1dp11a3hop92u49b1fb45j8qs9hoo
714. -- #mpe805fs330vqp5l5mg73deahken20dub4hrfvmuutfo97dikgagvimncfr6mfp1l24bjqes1m1dp11a3hop92u49b1fb45j8qs9hoo
fileExists : Text ->{IO, Exception} Boolean
714. -- #cft2pjc05jljtlefm4osg96k5t2look2ujq1tgg5hoc5i3fkkatt9pf79g2ka461kq8nbmsggrvo2675ocl599to9e8nre5oef4scdo
715. -- #cft2pjc05jljtlefm4osg96k5t2look2ujq1tgg5hoc5i3fkkatt9pf79g2ka461kq8nbmsggrvo2675ocl599to9e8nre5oef4scdo
fromB32 : Bytes ->{Exception} Bytes
715. -- #13fpchr37ua0pr38ssr7j22pudmseuedf490aok18upagh0f00kg40guj9pgl916v9qurqrvu53f3lpsvi0s82hg3dtjacanrpjvs38
716. -- #13fpchr37ua0pr38ssr7j22pudmseuedf490aok18upagh0f00kg40guj9pgl916v9qurqrvu53f3lpsvi0s82hg3dtjacanrpjvs38
fromHex : Text -> Bytes
716. -- #b36oslvh534s82lda0ghc5ql7p7nir0tknsluigulmpso22tjh62uiiq4lq9s3m97a2grkso0qofpb423p06olkkikrt4mfn15vpkug
717. -- #b36oslvh534s82lda0ghc5ql7p7nir0tknsluigulmpso22tjh62uiiq4lq9s3m97a2grkso0qofpb423p06olkkikrt4mfn15vpkug
getBuffering : Handle ->{IO, Exception} BufferMode
717. -- #9vijttgmba0ui9cshmhmmvgn6ve2e95t168766h2n6pkviddebiimgipic5dbg5lmiht12g6np8a7e06jpk03rnue3ln5mbo4prde0g
718. -- #9vijttgmba0ui9cshmhmmvgn6ve2e95t168766h2n6pkviddebiimgipic5dbg5lmiht12g6np8a7e06jpk03rnue3ln5mbo4prde0g
getBytes : Handle -> Nat ->{IO, Exception} Bytes
718. -- #c5oeqqglf28ungtq1im4fjdh317eeoba4537l1ntq3ob22v07rpgj9307udscbghlrior398hqm1ci099qmriim8cs975kocacsd9r0
719. -- #c5oeqqglf28ungtq1im4fjdh317eeoba4537l1ntq3ob22v07rpgj9307udscbghlrior398hqm1ci099qmriim8cs975kocacsd9r0
getChar : Handle ->{IO, Exception} Char
719. -- #j9jdo2pqvi4aktcfsb0n4ns1tk2be7dtckqdeedqp7n52oghsq82cgc1tv562rj1sf1abq2h0vta4uo6873cdbgrtrvd5cvollu3ovo
720. -- #j9jdo2pqvi4aktcfsb0n4ns1tk2be7dtckqdeedqp7n52oghsq82cgc1tv562rj1sf1abq2h0vta4uo6873cdbgrtrvd5cvollu3ovo
getEcho : Handle ->{IO, Exception} Boolean
720. -- #0hj09gufk8fs2hvr6qij6pie8bp0h6hmm6hpsi8d5fvl1fp1dbk6u8c9p6h4eu2hle6ctgpdbepo9vit5atllkodogn6r0csar9fn1g
721. -- #0hj09gufk8fs2hvr6qij6pie8bp0h6hmm6hpsi8d5fvl1fp1dbk6u8c9p6h4eu2hle6ctgpdbepo9vit5atllkodogn6r0csar9fn1g
getLine : Handle ->{IO, Exception} Text
721. -- #ck1nfg5fainelng0694jkdf9e06pmn60h7kvble1ff7hkc6jdgqtf7g5o3qevr7ic1bdhfn5n2rc3gde5bh6o9fpbit3ocs0av0scdg
722. -- #ck1nfg5fainelng0694jkdf9e06pmn60h7kvble1ff7hkc6jdgqtf7g5o3qevr7ic1bdhfn5n2rc3gde5bh6o9fpbit3ocs0av0scdg
getSomeBytes : Handle -> Nat ->{IO, Exception} Bytes
722. -- #bk29bjnrcuh55usf3vocm4j1aml161p6ila7t82cpr3ub9vu0g9lsg2mspmfuefc4ig0qtdqk7nds4t3f68jp6o77e0h4ltbitqjpno
723. -- #bk29bjnrcuh55usf3vocm4j1aml161p6ila7t82cpr3ub9vu0g9lsg2mspmfuefc4ig0qtdqk7nds4t3f68jp6o77e0h4ltbitqjpno
getTempDirectory : '{IO, Exception} Text
723. -- #j8i534slc2rvakvmqcb6j28iatrh3d7btajai9qndutr0edi5aaoi2p5noditaococ4l104hdhhvjc5vr0rbcjoqrbng46fdeqtnf98
724. -- #j8i534slc2rvakvmqcb6j28iatrh3d7btajai9qndutr0edi5aaoi2p5noditaococ4l104hdhhvjc5vr0rbcjoqrbng46fdeqtnf98
handlePosition : Handle ->{IO, Exception} Nat
724. -- #bgf7sqs0h0p8bhm3t2ei8006oj1gjonvtkdejv2g9kar0kmvob9e88ceevdfh99jom9rs0hbalf1gut5juanudfcb8tpb1e9ta0vrm8
725. -- #bgf7sqs0h0p8bhm3t2ei8006oj1gjonvtkdejv2g9kar0kmvob9e88ceevdfh99jom9rs0hbalf1gut5juanudfcb8tpb1e9ta0vrm8
handshake : Tls ->{IO, Exception} ()
725. -- #128490j1tmitiu3vesv97sqspmefobg1am38vos9p0vt4s1bhki87l7kj4cctquffkp40eanmr9ummfglj9i7s25jrpb32ob5sf2tio
726. -- #128490j1tmitiu3vesv97sqspmefobg1am38vos9p0vt4s1bhki87l7kj4cctquffkp40eanmr9ummfglj9i7s25jrpb32ob5sf2tio
hex : Bytes -> Text
726. -- #ttjui80dbufvf3vgaddmcr065dpgl0rtp68i5cdht6tq4t2vk3i2vg60hi77rug368qijgijf8oui27te7o5oq0t0osm6dg65c080i0
727. -- #ttjui80dbufvf3vgaddmcr065dpgl0rtp68i5cdht6tq4t2vk3i2vg60hi77rug368qijgijf8oui27te7o5oq0t0osm6dg65c080i0
id : a -> a
727. -- #9qnapjbbdhcc2mjf1b0slm7mefu0idnj1bs4c5bckq42ruodftolnd193uehr31lc01air6d6b3j4ihurnks13n85h3r8rs16nqvj2g
728. -- #9qnapjbbdhcc2mjf1b0slm7mefu0idnj1bs4c5bckq42ruodftolnd193uehr31lc01air6d6b3j4ihurnks13n85h3r8rs16nqvj2g
isDirectory : Text ->{IO, Exception} Boolean
728. -- #vb1e252fqt0q63hpmtkq2bkg5is2n6thejofnev96040thle5o1ia8dtq7dc6v359gtoqugbqg5tb340aqovrfticb63jgei4ncq3j8
729. -- #vb1e252fqt0q63hpmtkq2bkg5is2n6thejofnev96040thle5o1ia8dtq7dc6v359gtoqugbqg5tb340aqovrfticb63jgei4ncq3j8
isFileEOF : Handle ->{IO, Exception} Boolean
729. -- #ahkhlm9sd7arpevos99sqc90g7k5nn9bj5n0lhh82c1uva52ltv0295ugc123l17vd1orkng061e11knqjnmk087qjg3vug3rs6mv60
730. -- #ahkhlm9sd7arpevos99sqc90g7k5nn9bj5n0lhh82c1uva52ltv0295ugc123l17vd1orkng061e11knqjnmk087qjg3vug3rs6mv60
isFileOpen : Handle ->{IO, Exception} Boolean
730. -- #2a11371klrv2i8726knma0l3g14on4m2ucihpg65cjj9k930aefg65ovvg0ak4uv3i9evtnu0a5249q3i8ugheqd65cnmgquc1a88n0
731. -- #2a11371klrv2i8726knma0l3g14on4m2ucihpg65cjj9k930aefg65ovvg0ak4uv3i9evtnu0a5249q3i8ugheqd65cnmgquc1a88n0
isNone : Optional a -> Boolean
731. -- #ln4avnqpdk7813vsrrr414hg0smcmufrl1c7b87nb7nb0h9cogp6arqa7fbgd7rgolffmgue698ovvefo18j1k8g30t4hbp23onm3l8
732. -- #ln4avnqpdk7813vsrrr414hg0smcmufrl1c7b87nb7nb0h9cogp6arqa7fbgd7rgolffmgue698ovvefo18j1k8g30t4hbp23onm3l8
isSeekable : Handle ->{IO, Exception} Boolean
732. -- #gop2v9s6l24ii1v6bf1nks2h0h18pato0vbsf4u3el18s7mp1jfnp4c7fesdf9sunnlv5f5a9fjr1s952pte87mf63l1iqki9bp0mio
733. -- #gop2v9s6l24ii1v6bf1nks2h0h18pato0vbsf4u3el18s7mp1jfnp4c7fesdf9sunnlv5f5a9fjr1s952pte87mf63l1iqki9bp0mio
List.all : (a ->{ε} Boolean) -> [a] ->{ε} Boolean
733. -- #m2g5korqq5etr0qk1qrgjbaqktj4ks4bu9m3c4v3j9g8ktsd2e218nml6q8vo45bi3meb53csack40mle6clfrfep073e313b3jagt0
734. -- #m2g5korqq5etr0qk1qrgjbaqktj4ks4bu9m3c4v3j9g8ktsd2e218nml6q8vo45bi3meb53csack40mle6clfrfep073e313b3jagt0
List.filter : (a ->{g} Boolean) -> [a] ->{g} [a]
734. -- #8s836vq5jggucs6bj3bear30uhe6h9cskudjrdc772ghiec6ce2jqft09l1n05kd1n6chekrbgt0h8mkc9drgscjvgghacojm9e8c5o
735. -- #8s836vq5jggucs6bj3bear30uhe6h9cskudjrdc772ghiec6ce2jqft09l1n05kd1n6chekrbgt0h8mkc9drgscjvgghacojm9e8c5o
List.foldLeft : (b ->{g} a ->{g} b) -> b -> [a] ->{g} b
735. -- #m5tlb5a0m4kp5b4m9oq9vhda9d7nhu2obn2lpmosal0ebij9gon4gkd1aq0b3b61jtsc1go0hi7b2sm2memtil55ijq32b2n0k39vko
736. -- #m5tlb5a0m4kp5b4m9oq9vhda9d7nhu2obn2lpmosal0ebij9gon4gkd1aq0b3b61jtsc1go0hi7b2sm2memtil55ijq32b2n0k39vko
List.forEach : [a] -> (a ->{e} ()) ->{e} ()
736. -- #j9ve4ionu2sn7f814t0t4gc75objke2drgnfvvvb50v2f57ss0hlsa3ai5g5jsk2t4b8s37ocrtmte7nktfb2vjf8508ksvrc6llu30
737. -- #j9ve4ionu2sn7f814t0t4gc75objke2drgnfvvvb50v2f57ss0hlsa3ai5g5jsk2t4b8s37ocrtmte7nktfb2vjf8508ksvrc6llu30
listen : Socket ->{IO, Exception} ()
737. -- #s0f4et1o1ns8cmmvp3i0cm6cmmv5qaf99qm2q4jmgpciof6ntmuh3mpr4epns3ocskn8raacbvm30ovvj2b6arv0ff7iks31rannbf0
738. -- #s0f4et1o1ns8cmmvp3i0cm6cmmv5qaf99qm2q4jmgpciof6ntmuh3mpr4epns3ocskn8raacbvm30ovvj2b6arv0ff7iks31rannbf0
loadCodeBytes : Bytes ->{Exception} Code
738. -- #gvaed1m07qihc9c216125sur1q9a7i5ita44qnevongg4jrbd8k2plsqhdur45nn6h3drn6lc3iidp1b208ht8s73fg2711l76c7j4g
739. -- #gvaed1m07qihc9c216125sur1q9a7i5ita44qnevongg4jrbd8k2plsqhdur45nn6h3drn6lc3iidp1b208ht8s73fg2711l76c7j4g
loadSelfContained : Text ->{IO, Exception} a
739. -- #g1hqlq27e3stamnnfp6q178pleeml9sbo2d6scj2ikubocane5cvf8ctausoqrgj9co9h56ttgt179sgktc0bei2r37dmtj51jg0ou8
740. -- #g1hqlq27e3stamnnfp6q178pleeml9sbo2d6scj2ikubocane5cvf8ctausoqrgj9co9h56ttgt179sgktc0bei2r37dmtj51jg0ou8
loadValueBytes : Bytes
->{IO, Exception} ([(Link.Term, Code)], Value)
740. -- #tlllu51stumo77vi2e5m0e8m05qletfbr3nea3d84dcgh66dq4s3bt7kdbf8mpdqh16mmnoh11kr3n43m8b5g4pf95l9gfbhhok1h20
741. -- #tlllu51stumo77vi2e5m0e8m05qletfbr3nea3d84dcgh66dq4s3bt7kdbf8mpdqh16mmnoh11kr3n43m8b5g4pf95l9gfbhhok1h20
MVar.put : MVar i -> i ->{IO, Exception} ()
741. -- #3b7lp7s9m31mcvh73nh4gfj1kal6onrmppf35esvmma4jsg7bbm7a8tsrfcb4te88f03r97dkf7n1f2kcc6o7ng4vurp95svfj2fg7o
742. -- #3b7lp7s9m31mcvh73nh4gfj1kal6onrmppf35esvmma4jsg7bbm7a8tsrfcb4te88f03r97dkf7n1f2kcc6o7ng4vurp95svfj2fg7o
MVar.read : MVar o ->{IO, Exception} o
742. -- #be8m7lsjnf31u87pt5rvn04c9ellhbm3p56jgapbp8k7qp0v3mm7beh81luoifp17681l0ldjj46gthmmu32lkn0jnejr3tedjotntg
743. -- #be8m7lsjnf31u87pt5rvn04c9ellhbm3p56jgapbp8k7qp0v3mm7beh81luoifp17681l0ldjj46gthmmu32lkn0jnejr3tedjotntg
MVar.swap : MVar o -> o ->{IO, Exception} o
743. -- #c2qb0ca2dj3rronbp4slj3ph56p0iopaos7ib37hjunpkl1rcl1gp820dpg8qflhvt9cm2l1bfm40rkdslce2sr6f0oru5lr5cl5nu0
744. -- #c2qb0ca2dj3rronbp4slj3ph56p0iopaos7ib37hjunpkl1rcl1gp820dpg8qflhvt9cm2l1bfm40rkdslce2sr6f0oru5lr5cl5nu0
MVar.take : MVar o ->{IO, Exception} o
744. -- #ht0k9hb3k1cnjsgmtu9klivo074a2uro4csh63m1sqr2483rkojlj7abcf0jfmssbfig98i6is1osr2djoqubg3bp6articvq9o8090
745. -- #ht0k9hb3k1cnjsgmtu9klivo074a2uro4csh63m1sqr2483rkojlj7abcf0jfmssbfig98i6is1osr2djoqubg3bp6articvq9o8090
newClient : ClientConfig -> Socket ->{IO, Exception} Tls
745. -- #coeloqmjin6lais8u6j0plh5f1601lpcue4ejfcute46opams4vsbkplqj6jg6af0uecjie3mbclv40b3jumghsf09aavvucrc0d148
746. -- #coeloqmjin6lais8u6j0plh5f1601lpcue4ejfcute46opams4vsbkplqj6jg6af0uecjie3mbclv40b3jumghsf09aavvucrc0d148
newServer : ServerConfig -> Socket ->{IO, Exception} Tls
746. -- #ocvo5mvs8fghsf715tt4mhpj1pu8e8r7pq9nue63ut0ol2vnv70k7t6tavtsljlmdib9lo3bt669qac94dk53ldcgtukvotvrlfkan0
747. -- #ocvo5mvs8fghsf715tt4mhpj1pu8e8r7pq9nue63ut0ol2vnv70k7t6tavtsljlmdib9lo3bt669qac94dk53ldcgtukvotvrlfkan0
openFile : Text -> FileMode ->{IO, Exception} Handle
747. -- #c58qbcgd90d965dokk7bu82uehegkbe8jttm7lv4j0ohgi2qm3e3p4v1qfr8vc2dlsmsl9tv0v71kco8c18mneule0ntrhte4ks1090
748. -- #c58qbcgd90d965dokk7bu82uehegkbe8jttm7lv4j0ohgi2qm3e3p4v1qfr8vc2dlsmsl9tv0v71kco8c18mneule0ntrhte4ks1090
printLine : Text ->{IO, Exception} ()
748. -- #dck7pb7qv05ol3b0o76l88a22bc7enl781ton5qbs2umvgsua3p16n22il02m29592oohsnbt3cr7hnlumpdhv2ibjp6iji9te4iot0
749. -- #dck7pb7qv05ol3b0o76l88a22bc7enl781ton5qbs2umvgsua3p16n22il02m29592oohsnbt3cr7hnlumpdhv2ibjp6iji9te4iot0
printText : Text ->{IO} Either Failure ()
749. -- #i9lm1g1j0p4qtakg164jdlgac409sgj1cb91k86k0c44ssajbluovuu7ptm5uc20sjgedjbak3iji8o859ek871ul51b8l30s4uf978
750. -- #i9lm1g1j0p4qtakg164jdlgac409sgj1cb91k86k0c44ssajbluovuu7ptm5uc20sjgedjbak3iji8o859ek871ul51b8l30s4uf978
putBytes : Handle -> Bytes ->{IO, Exception} ()
750. -- #84j6ua3924v85vh2a581de7sd8pee1lqbp1ibvatvjtui9hvk36sv2riabu0v2r0s25p62ipnvv4aeadpg0u8m5ffqrc202i71caopg
751. -- #84j6ua3924v85vh2a581de7sd8pee1lqbp1ibvatvjtui9hvk36sv2riabu0v2r0s25p62ipnvv4aeadpg0u8m5ffqrc202i71caopg
readFile : Text ->{IO, Exception} Bytes
751. -- #pk003cv7lvidkbmsnne4mpt20254gh4hd7vvretnbk8na8bhr9fg9776rp8pt9srhiucrd1c7sjl006vmil9e78p40gdcir81ujil2o
752. -- #pk003cv7lvidkbmsnne4mpt20254gh4hd7vvretnbk8na8bhr9fg9776rp8pt9srhiucrd1c7sjl006vmil9e78p40gdcir81ujil2o
ready : Handle ->{IO, Exception} Boolean
752. -- #unn7qak4qe0nbbpf62uesu0fe8i68o83l4o7f6jcblefbla53fef7a63ts28fh6ql81o5c04j44g7m5rq9aouo73dpeprbl5lka8170
753. -- #unn7qak4qe0nbbpf62uesu0fe8i68o83l4o7f6jcblefbla53fef7a63ts28fh6ql81o5c04j44g7m5rq9aouo73dpeprbl5lka8170
receive : Tls ->{IO, Exception} Bytes
753. -- #ugs4208vpm97jr2ecmr7l9h4e22r1ije6v379m4v6229c8o7hk669ba63bor4pe6n1bm24il87iq2d99sj78lt6n5eqa1fre0grn93g
754. -- #ugs4208vpm97jr2ecmr7l9h4e22r1ije6v379m4v6229c8o7hk669ba63bor4pe6n1bm24il87iq2d99sj78lt6n5eqa1fre0grn93g
removeDirectory : Text ->{IO, Exception} ()
754. -- #6pia69u5u5rja1jk04v3i9ke24gf4b1t7vnaj0noogord6ekiqhf72qfkc1n08rd11f2cbkofni5rd5u7t1qkgslbi40hut35pfi1v0
755. -- #6pia69u5u5rja1jk04v3i9ke24gf4b1t7vnaj0noogord6ekiqhf72qfkc1n08rd11f2cbkofni5rd5u7t1qkgslbi40hut35pfi1v0
renameDirectory : Text -> Text ->{IO, Exception} ()
755. -- #amtsq2jq1k75r309esfp800a8slelm4d3q9i1pq1qqs3pil13at916958sf9ucb4607kpktbnup7nc58ecoq8mcs01e2a03d08agn18
756. -- #amtsq2jq1k75r309esfp800a8slelm4d3q9i1pq1qqs3pil13at916958sf9ucb4607kpktbnup7nc58ecoq8mcs01e2a03d08agn18
runTest : '{IO, TempDirs, Exception, Stream Result} a
->{IO} [Result]
756. -- #va4fcp72qog4dvo8dn4gipr2i1big1lqgpcqfuv9kc98ut8le1bj23s68df7svam7b5sg01s4uf95o458f4rs90mtp71nj84t90ra1o
757. -- #va4fcp72qog4dvo8dn4gipr2i1big1lqgpcqfuv9kc98ut8le1bj23s68df7svam7b5sg01s4uf95o458f4rs90mtp71nj84t90ra1o
saveSelfContained : a -> Text ->{IO, Exception} ()
757. -- #5hbn4gflbo8l4jq0s9l1r0fpee6ie44fbbl6j6km67l25inaaq5avg18g7j6mig2m6eaod04smif7el34tcclvvf8oll39rfonupt2o
758. -- #5hbn4gflbo8l4jq0s9l1r0fpee6ie44fbbl6j6km67l25inaaq5avg18g7j6mig2m6eaod04smif7el34tcclvvf8oll39rfonupt2o
saveTestCase : Text
-> (a -> Text)
-> a
->{IO, Exception} ()
758. -- #v2otbk1e0e81d6ea9i3j1kivnfam6rk6earsjbjljv4mmrk1mgfals6jhfd74evor6al9mkb5gv8hf15f02807f0aa0hnsg9fas1qco
759. -- #v2otbk1e0e81d6ea9i3j1kivnfam6rk6earsjbjljv4mmrk1mgfals6jhfd74evor6al9mkb5gv8hf15f02807f0aa0hnsg9fas1qco
seekHandle : Handle
-> SeekMode
-> Int
->{IO, Exception} ()
759. -- #a98jlos4rj2um55iksdin9p5djo6j70qmuitoe2ff3uvkefb8pqensorln5flr3pm8hkc0lqkchbd63cf9tl0kqnqu3i17kvqnm35g0
760. -- #a98jlos4rj2um55iksdin9p5djo6j70qmuitoe2ff3uvkefb8pqensorln5flr3pm8hkc0lqkchbd63cf9tl0kqnqu3i17kvqnm35g0
send : Tls -> Bytes ->{IO, Exception} ()
760. -- #qrdia2sc9vuoi7u3a4ukjk8lv0rlhn2i2bbin1adbhcuj79jn366dv3a8t52hpil0jtgkhhuiavibmdev63j5ndriod33rkktjekqv8
761. -- #qrdia2sc9vuoi7u3a4ukjk8lv0rlhn2i2bbin1adbhcuj79jn366dv3a8t52hpil0jtgkhhuiavibmdev63j5ndriod33rkktjekqv8
serverSocket : Optional Text
-> Text
->{IO, Exception} Socket
761. -- #3vft70875p42eao55rhb61siobuei4h0e9vlu4bbgucjo296c2vfjpucacovnu9538tvup5c7lo9123se8v4fe7m8q9aiqbkjpumkao
762. -- #3vft70875p42eao55rhb61siobuei4h0e9vlu4bbgucjo296c2vfjpucacovnu9538tvup5c7lo9123se8v4fe7m8q9aiqbkjpumkao
setBuffering : Handle -> BufferMode ->{IO, Exception} ()
762. -- #erqshamlurgahpd4rroild36cc5e4rk56r38r53vcbg8cblr82c6gfji3um8f09ffgjlg58g7r32mtsbvjlcq4c65v0jn3va9888mao
763. -- #erqshamlurgahpd4rroild36cc5e4rk56r38r53vcbg8cblr82c6gfji3um8f09ffgjlg58g7r32mtsbvjlcq4c65v0jn3va9888mao
setEcho : Handle -> Boolean ->{IO, Exception} ()
763. -- #ugar51qqij4ur24frdi84eqdkvqa0fbsi4v6e2586hi3tai52ovtpm3f2dc9crnfv8pk0ppq6b5tv3utl4sl49n5aecorgkqddr7i38
764. -- #ugar51qqij4ur24frdi84eqdkvqa0fbsi4v6e2586hi3tai52ovtpm3f2dc9crnfv8pk0ppq6b5tv3utl4sl49n5aecorgkqddr7i38
snd : ∀ a a1. (a1, a) -> a
764. -- #leoq6smeq8to5ej3314uuujmh6rfbcsdb9q8ah8h3ohg9jq5kftc93mq671o0qh2he9vqgd288k0ecea3h7eerpbgjt6a8p843tmon8
765. -- #leoq6smeq8to5ej3314uuujmh6rfbcsdb9q8ah8h3ohg9jq5kftc93mq671o0qh2he9vqgd288k0ecea3h7eerpbgjt6a8p843tmon8
socketAccept : Socket ->{IO, Exception} Socket
765. -- #s43jbp19k91qq704tidpue2vs2re1lh4mtv46rdmdnurkdndst7u0k712entcvip160vh9cilmpamikmflbprg5up0k6cl15b8tr5l0
766. -- #s43jbp19k91qq704tidpue2vs2re1lh4mtv46rdmdnurkdndst7u0k712entcvip160vh9cilmpamikmflbprg5up0k6cl15b8tr5l0
socketPort : Socket ->{IO, Exception} Nat
766. -- #3rp8h0dt7g60nrjdehuhqga9dmomti5rdqho7r1rm5rg5moet7kt3ieempo7c9urur752njachq6k48ggbic4ugbbv75jl2mfbk57a0
767. -- #3rp8h0dt7g60nrjdehuhqga9dmomti5rdqho7r1rm5rg5moet7kt3ieempo7c9urur752njachq6k48ggbic4ugbbv75jl2mfbk57a0
startsWith : Text -> Text -> Boolean
767. -- #elsab3sc7p4c6bj73pgvklv0j7qu268rn5isv6micfp7ib8grjoustpqdq0pkd4a379mr5ijb8duu2q0n040osfurppp8pt8vaue2fo
768. -- #elsab3sc7p4c6bj73pgvklv0j7qu268rn5isv6micfp7ib8grjoustpqdq0pkd4a379mr5ijb8duu2q0n040osfurppp8pt8vaue2fo
stdout : Handle
768. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8
769. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8
structural ability Stream a
769. -- #2jl99er43tnksj8r8oveap5ger9uqlvj0u0ghfs0uqa7i6m45jk976n7a726jb7rtusjdu2p8hbbcgmoacvke7k5o3kdgoj57c3v2v8
770. -- #2jl99er43tnksj8r8oveap5ger9uqlvj0u0ghfs0uqa7i6m45jk976n7a726jb7rtusjdu2p8hbbcgmoacvke7k5o3kdgoj57c3v2v8
Stream.collect : '{e, Stream a} r ->{e} ([a], r)
770. -- #rnuje46fvuqa4a8sdgl9e250a2gcmhtsscr8bdonj2bduhrst38ur7dorv3ahr2ghf9cufkfit7ndh9qb9gspbfapcnn3sol0l2moqg
771. -- #rnuje46fvuqa4a8sdgl9e250a2gcmhtsscr8bdonj2bduhrst38ur7dorv3ahr2ghf9cufkfit7ndh9qb9gspbfapcnn3sol0l2moqg
Stream.collect.handler : Request {Stream a} r -> ([a], r)
771. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8#0
772. -- #rfi1v9429f9qluv533l2iba77aadttilrpmnhljfapfnfa6sru2nr8ibpqvib9nc4s4nb9s1as45upsfqfqe6ivqi2p82b2vd866it8#0
Stream.emit : a ->{Stream a} ()
772. -- #c70gf5m1blvh8tg4kvt1taee036fr7r22bbtqcupac5r5igs102nj077vdl0nimef94u951kfcl9a5hcevo01j04v9o6v3cpndq41bo
773. -- #c70gf5m1blvh8tg4kvt1taee036fr7r22bbtqcupac5r5igs102nj077vdl0nimef94u951kfcl9a5hcevo01j04v9o6v3cpndq41bo
Stream.toList : '{Stream a} r -> [a]
773. -- #ul69cgsrsspjni8b0hqnt4kt4bk7sjtp6jvlhhofom7bemu9nb2kimm6tt1raigr7j86afgmnjnrfabn6a5l5v1t219uidiu22ueiv0
774. -- #ul69cgsrsspjni8b0hqnt4kt4bk7sjtp6jvlhhofom7bemu9nb2kimm6tt1raigr7j86afgmnjnrfabn6a5l5v1t219uidiu22ueiv0
Stream.toList.handler : Request {Stream a} r -> [a]
774. -- #58d8kfuq8sqbipa1aaijjhm28pa6a844h19mgg5s4a1h160etbulig21cm0pcnfla8fisqvrp80840g9luid5u8amvcc8sf46pd25h8
775. -- #58d8kfuq8sqbipa1aaijjhm28pa6a844h19mgg5s4a1h160etbulig21cm0pcnfla8fisqvrp80840g9luid5u8amvcc8sf46pd25h8
systemTime : '{IO, Exception} Nat
775. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18
776. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18
structural ability TempDirs
776. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#0
777. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#0
TempDirs.newTempDir : Text ->{TempDirs} Text
777. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#1
778. -- #11mhfqj6rts8lm3im7saf44tn3km5bboqtu1td0udnaiit4qqg6ar1ecmccosl6gufsnp6sug3vcmgapsc58sgj7dh7rg8msq2qkj18#1
TempDirs.removeDir : Text ->{TempDirs} ()
778. -- #natgur73q6b4c3tp5jcor0v1cdnplh0n3fhm4qvhg4v74u3e3ff1352shs1lveot83lj82qqbl78n40qi9a132fhkmaa6g5s1ja91go
779. -- #natgur73q6b4c3tp5jcor0v1cdnplh0n3fhm4qvhg4v74u3e3ff1352shs1lveot83lj82qqbl78n40qi9a132fhkmaa6g5s1ja91go
terminate : Tls ->{IO, Exception} ()
779. -- #i3pbnc98rbfug5dnnvpd4uahm2e5fld2fu0re9r305isffr1r43048h7ql6ojdbjcsvjr6h91s6i026na046ltg5ff59klla6e7vq98
780. -- #i3pbnc98rbfug5dnnvpd4uahm2e5fld2fu0re9r305isffr1r43048h7ql6ojdbjcsvjr6h91s6i026na046ltg5ff59klla6e7vq98
testAutoClean : '{IO} [Result]
780. -- #spepthutvs3p6je794h520665rh8abl36qg43i7ipvj0mtg5sb0sbemjp2vpu9j3feithk2ae0sdtcmb8afoglo9rnvl350380t21h0
781. -- #spepthutvs3p6je794h520665rh8abl36qg43i7ipvj0mtg5sb0sbemjp2vpu9j3feithk2ae0sdtcmb8afoglo9rnvl350380t21h0
Text.fromUtf8 : Bytes ->{Exception} Text
781. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8
782. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8
structural ability Throw e
782. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8#0
783. -- #32q9jqhmi8f08pec3hj0je4u7k52f9f1hdfsmn9ncg2kpki5da9dabigplvdcot3a00k7s5npc4n78psd6ojaumqjla259e9pqd4ov8#0
Throw.throw : e ->{Throw e} a
783. -- #vri6fsnl704n6aqs346p6ijcbkcsv9875edr6b74enumrhbjiuon94ir4ufmrrn84k9b2jka4f05o16mcvsjrjav6gpskpiu4sknd1g
784. -- #vri6fsnl704n6aqs346p6ijcbkcsv9875edr6b74enumrhbjiuon94ir4ufmrrn84k9b2jka4f05o16mcvsjrjav6gpskpiu4sknd1g
uncurry : ∀ o g1 i g i1.
(i1 ->{g} i ->{g1} o) -> (i1, i) ->{g1, g} o
784. -- #u2j1bektndcqdo1m13fvu6apt9td96s4tqonelg23tauklak2pqnbisf41v632fmlrcc6f9orqo3iu9757q36ue5ol1khe0hh8pktro
785. -- #u2j1bektndcqdo1m13fvu6apt9td96s4tqonelg23tauklak2pqnbisf41v632fmlrcc6f9orqo3iu9757q36ue5ol1khe0hh8pktro
Value.transitiveDeps : Value ->{IO} [(Link.Term, Code)]
785. -- #o5bg5el7ckak28ib98j5b6rt26bqbprpddd1brrg3s18qahhbbe3uohufjjnt5eenvtjg0hrvnvpra95jmdppqrovvmcfm1ih2k7guo
786. -- #o5bg5el7ckak28ib98j5b6rt26bqbprpddd1brrg3s18qahhbbe3uohufjjnt5eenvtjg0hrvnvpra95jmdppqrovvmcfm1ih2k7guo
void : x -> ()
786. -- #8ugamqlp7a4g0dmbcvipqfi8gnuuj23pjbdfbof11naiun1qf8otjcap80epaom2kl9fv5rhjaudt4558n38dovrc0lhipubqjgm8mg
787. -- #8ugamqlp7a4g0dmbcvipqfi8gnuuj23pjbdfbof11naiun1qf8otjcap80epaom2kl9fv5rhjaudt4558n38dovrc0lhipubqjgm8mg
writeFile : Text -> Bytes ->{IO, Exception} ()
787. -- #lcmj2envm11lrflvvcl290lplhvbccv82utoej0lg0eomhmsf2vrv8af17k6if7ff98fp1b13rkseng3fng4stlr495c8dn3gn4k400
788. -- #lcmj2envm11lrflvvcl290lplhvbccv82utoej0lg0eomhmsf2vrv8af17k6if7ff98fp1b13rkseng3fng4stlr495c8dn3gn4k400
|> : a -> (a ->{g} t) ->{g} t

View File

@ -658,13 +658,14 @@ Let's try it!
474. Universal.> : a -> a -> Boolean
475. Universal.>= : a -> a -> Boolean
476. Universal.compare : a -> a -> Int
477. unsafe.coerceAbilities : (a ->{e1} b) -> a ->{e2} b
478. builtin type Value
479. Value.dependencies : Value -> [Term]
480. Value.deserialize : Bytes -> Either Text Value
481. Value.load : Value ->{IO} Either [Term] a
482. Value.serialize : Value -> Bytes
483. Value.value : a -> Value
477. Universal.murmurHash : a -> Nat
478. unsafe.coerceAbilities : (a ->{e1} b) -> a ->{e2} b
479. builtin type Value
480. Value.dependencies : Value -> [Term]
481. Value.deserialize : Bytes -> Either Text Value
482. Value.load : Value ->{IO} Either [Term] a
483. Value.serialize : Value -> Bytes
484. Value.value : a -> Value
.builtin> alias.many 94-104 .mylib

View File

@ -69,7 +69,7 @@ The `builtins.merge` command adds the known builtins to a `builtin` subnamespace
58. Tuple/ (1 term)
59. Unit (type)
60. Unit/ (1 term)
61. Universal/ (6 terms)
61. Universal/ (7 terms)
62. Value (builtin type)
63. Value/ (5 terms)
64. bug (a -> b)

View File

@ -360,6 +360,19 @@ openFile]
.> add
```
## Universal hash functions
Just exercises the function
```unison
> Universal.murmurHash 1
test> Universal.murmurHash.tests = checks [Universal.murmurHash [1,2,3] == Universal.murmurHash [1,2,3]]
```
```ucm:hide
.> add
```
## Run the tests
Now that all the tests have been added to the codebase, let's view the test report. This will fail the transcript (with a nice message) if any of the tests are failing.

View File

@ -378,6 +378,37 @@ openFile]
✅ Passed Passed
```
## Universal hash functions
Just exercises the function
```unison
> Universal.murmurHash 1
test> Universal.murmurHash.tests = checks [Universal.murmurHash [1,2,3] == Universal.murmurHash [1,2,3]]
```
```ucm
I found and typechecked these definitions in scratch.u. If you
do an `add` or `update`, here's how your codebase would
change:
⍟ These new definitions are ok to `add`:
Universal.murmurHash.tests : [Result]
Now evaluating any watch expressions (lines starting with
`>`)... Ctrl+C cancels.
1 | > Universal.murmurHash 1
5006114823290027883
2 | test> Universal.murmurHash.tests = checks [Universal.murmurHash [1,2,3] == Universal.murmurHash [1,2,3]]
✅ Passed Passed
```
## Run the tests
@ -411,8 +442,9 @@ Now that all the tests have been added to the codebase, let's view the test repo
◉ Text.tests.patterns Passed
◉ Text.tests.repeat Passed
◉ Text.tests.takeDropAppend Passed
◉ Universal.murmurHash.tests Passed
✅ 23 test(s) passing
✅ 24 test(s) passing
Tip: Use view Any.test1 to view the source of a test.

View File

@ -23,7 +23,7 @@ Technically, the definitions all exist, but they have no names. `builtins.merge`
.foo> ls
1. builtin/ (419 terms, 64 types)
1. builtin/ (420 terms, 64 types)
```
And for a limited time, you can get even more builtin goodies:
@ -35,7 +35,7 @@ And for a limited time, you can get even more builtin goodies:
.foo> ls
1. builtin/ (591 terms, 82 types)
1. builtin/ (592 terms, 82 types)
```
More typically, you'd start out by pulling `base.

View File

@ -61,6 +61,11 @@ foo = with -- unclosed
### Matching
```unison:error
-- No cases
foo = match 1 with
```
```unison:error
foo = match 1 with
2 -- no right-hand-side
@ -73,6 +78,29 @@ foo = cases
3 -> ()
```
```unison:error
-- Missing a '->'
x = match Some a with
None ->
1
Some _
2
```
```unison:error
-- Missing patterns
x = match Some a with
None -> 1
-> 2
-> 3
```
```unison:error
-- Guards following an unguarded case
x = match Some a with
None -> 1
| true -> 2
```
### Watches

View File

@ -162,20 +162,33 @@ foo = with -- unclosed
### Matching
```unison
-- No cases
foo = match 1 with
2 -- no right-hand-side
```
```ucm
😶
I expected some patterns after a match / with but I didn't
find any.
I expected some patterns after a match / with or cases but I
didn't find any.
1 | foo = match 1 with
2 | foo = match 1 with
```
```unison
foo = match 1 with
2 -- no right-hand-side
```
```ucm
offset=8:
unexpected <outdent>
expecting ",", case match, or pattern guard
3 |
```
```unison
-- Mismatched arities
@ -195,6 +208,56 @@ foo = cases
4 | 3 -> ()
```
```unison
-- Missing a '->'
x = match Some a with
None ->
1
Some _
2
```
```ucm
offset=16:
unexpected <outdent>
expecting ",", blank, case match, false, pattern guard, or true
7 |
```
```unison
-- Missing patterns
x = match Some a with
None -> 1
-> 2
-> 3
```
```ucm
offset=12:
unexpected ->
expecting newline or semicolon
4 | -> 2
```
```unison
-- Guards following an unguarded case
x = match Some a with
None -> 1
| true -> 2
```
```ucm
offset=12:
unexpected |
expecting newline or semicolon
4 | | true -> 2
```
### Watches

View File

@ -121,13 +121,13 @@ We can also delete the fork if we're done with it. (Don't worry, it's still in t
Note: The most recent namespace hash is immediately below this
message.
⊙ 1. #ss5rfipsc9
⊙ 1. #1487pemruj
- Deletes:
feature1.y
⊙ 2. #pbsfditts0
⊙ 2. #qdsgea37fc
+ Adds / updates:
@ -138,26 +138,26 @@ We can also delete the fork if we're done with it. (Don't worry, it's still in t
Original name New name(s)
feature1.y master.y
⊙ 3. #6vsh9eatk2
⊙ 3. #ppkkh269f7
+ Adds / updates:
feature1.y
⊙ 4. #8q0ijp9unj
⊙ 4. #u8aiheqfug
> Moves:
Original name New name
x master.x
⊙ 5. #5ultfinuna
⊙ 5. #es9cmc7kok
+ Adds / updates:
x
□ 6. #hsdh3pm9ua (start of history)
□ 6. #jo7t8m4dft (start of history)
```
To resurrect an old version of a namespace, you can learn its hash via the `history` command, then use `fork #namespacehash .newname`.

View File

@ -267,7 +267,7 @@ I should be able to move the root into a sub-namespace
.> ls
1. root/ (596 terms, 83 types)
1. root/ (597 terms, 83 types)
.> history
@ -276,13 +276,13 @@ I should be able to move the root into a sub-namespace
□ 1. #trup0d2160 (start of history)
□ 1. #eur72kuror (start of history)
```
```ucm
.> ls .root.at.path
1. builtin/ (591 terms, 82 types)
1. builtin/ (592 terms, 82 types)
2. existing/ (1 term)
3. happy/ (3 terms, 1 type)
4. history/ (1 term)
@ -292,7 +292,7 @@ I should be able to move the root into a sub-namespace
Note: The most recent namespace hash is immediately below this
message.
⊙ 1. #dd8n885fue
⊙ 1. #uu7qrred6m
- Deletes:
@ -303,7 +303,7 @@ I should be able to move the root into a sub-namespace
Original name New name
existing.a.termInA existing.b.termInA
⊙ 2. #k5g4ehotlf
⊙ 2. #91mc5pd4t0
+ Adds / updates:
@ -315,26 +315,26 @@ I should be able to move the root into a sub-namespace
happy.b.termInA existing.a.termInA
history.b.termInA existing.a.termInA
⊙ 3. #aqijafrrrj
⊙ 3. #ndr3vmlmv7
+ Adds / updates:
existing.a.termInA existing.b.termInB
⊙ 4. #el3jo3o2n3
⊙ 4. #2jqg9n2e8u
> Moves:
Original name New name
history.a.termInA history.b.termInA
⊙ 5. #io04ududm1
⊙ 5. #dsj92ppiqi
- Deletes:
history.b.termInB
⊙ 6. #7u417uihfu
⊙ 6. #n0a5seofan
+ Adds / updates:
@ -345,13 +345,13 @@ I should be able to move the root into a sub-namespace
Original name New name(s)
happy.b.termInA history.a.termInA
⊙ 7. #09p85hi2gq
⊙ 7. #i3nsbtl7kc
+ Adds / updates:
history.a.termInA history.b.termInB
⊙ 8. #rqjb9hgqfn
⊙ 8. #a2u0kep087
> Moves:
@ -361,7 +361,7 @@ I should be able to move the root into a sub-namespace
happy.a.T.T2 happy.b.T.T2
happy.a.termInA happy.b.termInA
⊙ 9. #11fgfgp2m2
⊙ 9. #g18uf760mb
+ Adds / updates:
@ -371,7 +371,7 @@ I should be able to move the root into a sub-namespace
happy.a.T.T
⊙ 10. #627cdfv199
⊙ 10. #2edl4803r1
+ Adds / updates:
@ -383,7 +383,7 @@ I should be able to move the root into a sub-namespace
⊙ 11. #5o3ve5br4l
⊙ 11. #qcd5obbuv8
```

View File

@ -1012,406 +1012,408 @@ d = c + 10
354. builtin.io2.Clock.internals.monotonic : '{IO} Either
Failure
TimeSpec
355. builtin.Int.negate : Int
355. builtin.Universal.murmurHash : a
-> Nat
356. builtin.Int.negate : Int
-> Int
356. builtin.io2.MVar.new : a
357. builtin.io2.MVar.new : a
->{IO} MVar
a
357. builtin.io2.Promise.new : '{IO} Promise
358. builtin.io2.Promise.new : '{IO} Promise
a
358. builtin.io2.TVar.new : a
359. builtin.io2.TVar.new : a
->{STM} TVar
a
359. builtin.io2.MVar.newEmpty : '{IO} MVar
360. builtin.io2.MVar.newEmpty : '{IO} MVar
a
360. builtin.io2.TVar.newIO : a
361. builtin.io2.TVar.newIO : a
->{IO} TVar
a
361. builtin.Boolean.not : Boolean
362. builtin.Boolean.not : Boolean
-> Boolean
362. builtin.Text.patterns.notCharIn : [Char]
363. builtin.Text.patterns.notCharIn : [Char]
-> Pattern
Text
363. builtin.Text.patterns.notCharRange : Char
364. builtin.Text.patterns.notCharRange : Char
-> Char
-> Pattern
Text
364. builtin.io2.Clock.internals.nsec : TimeSpec
365. builtin.io2.Clock.internals.nsec : TimeSpec
-> Nat
365. builtin.Int.or : Int
366. builtin.Int.or : Int
-> Int
-> Int
366. builtin.Nat.or : Nat
367. builtin.Nat.or : Nat
-> Nat
-> Nat
367. builtin.Pattern.or : Pattern
368. builtin.Pattern.or : Pattern
a
-> Pattern
a
-> Pattern
a
368. builtin.Int.popCount : Int
369. builtin.Int.popCount : Int
-> Nat
369. builtin.Nat.popCount : Nat
370. builtin.Nat.popCount : Nat
-> Nat
370. builtin.Float.pow : Float
371. builtin.Float.pow : Float
-> Float
-> Float
371. builtin.Int.pow : Int
372. builtin.Int.pow : Int
-> Nat
-> Int
372. builtin.Nat.pow : Nat
373. builtin.Nat.pow : Nat
-> Nat
-> Nat
373. builtin.io2.Clock.internals.processCPUTime : '{IO} Either
374. builtin.io2.Clock.internals.processCPUTime : '{IO} Either
Failure
TimeSpec
374. builtin.Text.patterns.punctuation : Pattern
375. builtin.Text.patterns.punctuation : Pattern
Text
375. builtin.ImmutableArray.read : ImmutableArray
376. builtin.ImmutableArray.read : ImmutableArray
a
-> Nat
->{Exception} a
376. builtin.MutableArray.read : MutableArray
377. builtin.MutableArray.read : MutableArray
g a
-> Nat
->{g,
Exception} a
377. builtin.io2.Promise.read : Promise
378. builtin.io2.Promise.read : Promise
a
->{IO} a
378. builtin.Ref.read : Ref g a
379. builtin.Ref.read : Ref g a
->{g} a
379. builtin.io2.TVar.read : TVar a
380. builtin.io2.TVar.read : TVar a
->{STM} a
380. builtin.io2.Ref.Ticket.read : Ticket
381. builtin.io2.Ref.Ticket.read : Ticket
a
-> a
381. builtin.ImmutableByteArray.read16be : ImmutableByteArray
382. builtin.ImmutableByteArray.read16be : ImmutableByteArray
-> Nat
->{Exception} Nat
382. builtin.MutableByteArray.read16be : MutableByteArray
383. builtin.MutableByteArray.read16be : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
383. builtin.ImmutableByteArray.read24be : ImmutableByteArray
384. builtin.ImmutableByteArray.read24be : ImmutableByteArray
-> Nat
->{Exception} Nat
384. builtin.MutableByteArray.read24be : MutableByteArray
385. builtin.MutableByteArray.read24be : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
385. builtin.ImmutableByteArray.read32be : ImmutableByteArray
386. builtin.ImmutableByteArray.read32be : ImmutableByteArray
-> Nat
->{Exception} Nat
386. builtin.MutableByteArray.read32be : MutableByteArray
387. builtin.MutableByteArray.read32be : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
387. builtin.ImmutableByteArray.read40be : ImmutableByteArray
388. builtin.ImmutableByteArray.read40be : ImmutableByteArray
-> Nat
->{Exception} Nat
388. builtin.MutableByteArray.read40be : MutableByteArray
389. builtin.MutableByteArray.read40be : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
389. builtin.ImmutableByteArray.read64be : ImmutableByteArray
390. builtin.ImmutableByteArray.read64be : ImmutableByteArray
-> Nat
->{Exception} Nat
390. builtin.MutableByteArray.read64be : MutableByteArray
391. builtin.MutableByteArray.read64be : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
391. builtin.ImmutableByteArray.read8 : ImmutableByteArray
392. builtin.ImmutableByteArray.read8 : ImmutableByteArray
-> Nat
->{Exception} Nat
392. builtin.MutableByteArray.read8 : MutableByteArray
393. builtin.MutableByteArray.read8 : MutableByteArray
g
-> Nat
->{g,
Exception} Nat
393. builtin.io2.Ref.readForCas : Ref
394. builtin.io2.Ref.readForCas : Ref
{IO} a
->{IO} Ticket
a
394. builtin.io2.TVar.readIO : TVar a
395. builtin.io2.TVar.readIO : TVar a
->{IO} a
395. builtin.io2.Clock.internals.realtime : '{IO} Either
396. builtin.io2.Clock.internals.realtime : '{IO} Either
Failure
TimeSpec
396. builtin.io2.IO.ref : a
397. builtin.io2.IO.ref : a
->{IO} Ref
{IO} a
397. builtin.Scope.ref : a
398. builtin.Scope.ref : a
->{Scope
s} Ref
{Scope
s}
a
398. builtin.Text.repeat : Nat
399. builtin.Text.repeat : Nat
-> Text
-> Text
399. builtin.Pattern.replicate : Nat
400. builtin.Pattern.replicate : Nat
-> Nat
-> Pattern
a
-> Pattern
a
400. builtin.io2.STM.retry : '{STM} a
401. builtin.Text.reverse : Text
401. builtin.io2.STM.retry : '{STM} a
402. builtin.Text.reverse : Text
-> Text
402. builtin.Float.round : Float
403. builtin.Float.round : Float
-> Int
403. builtin.Pattern.run : Pattern
404. builtin.Pattern.run : Pattern
a
-> a
-> Optional
( [a],
a)
404. builtin.Scope.run : (∀ s.
405. builtin.Scope.run : (∀ s.
'{g,
Scope s} r)
->{g} r
405. builtin.io2.Clock.internals.sec : TimeSpec
406. builtin.io2.Clock.internals.sec : TimeSpec
-> Int
406. builtin.Code.serialize : Code
407. builtin.Code.serialize : Code
-> Bytes
407. builtin.Value.serialize : Value
408. builtin.Value.serialize : Value
-> Bytes
408. builtin.io2.Tls.ClientConfig.certificates.set : [SignedCert]
409. builtin.io2.Tls.ClientConfig.certificates.set : [SignedCert]
-> ClientConfig
-> ClientConfig
409. builtin.io2.Tls.ServerConfig.certificates.set : [SignedCert]
410. builtin.io2.Tls.ServerConfig.certificates.set : [SignedCert]
-> ServerConfig
-> ServerConfig
410. builtin.io2.TLS.ClientConfig.ciphers.set : [Cipher]
411. builtin.io2.TLS.ClientConfig.ciphers.set : [Cipher]
-> ClientConfig
-> ClientConfig
411. builtin.io2.Tls.ServerConfig.ciphers.set : [Cipher]
412. builtin.io2.Tls.ServerConfig.ciphers.set : [Cipher]
-> ServerConfig
-> ServerConfig
412. builtin.io2.Tls.ClientConfig.versions.set : [Version]
413. builtin.io2.Tls.ClientConfig.versions.set : [Version]
-> ClientConfig
-> ClientConfig
413. builtin.io2.Tls.ServerConfig.versions.set : [Version]
414. builtin.io2.Tls.ServerConfig.versions.set : [Version]
-> ServerConfig
-> ServerConfig
414. builtin.Int.shiftLeft : Int
415. builtin.Int.shiftLeft : Int
-> Nat
-> Int
415. builtin.Nat.shiftLeft : Nat
416. builtin.Nat.shiftLeft : Nat
-> Nat
-> Nat
416. builtin.Int.shiftRight : Int
417. builtin.Int.shiftRight : Int
-> Nat
-> Int
417. builtin.Nat.shiftRight : Nat
418. builtin.Nat.shiftRight : Nat
-> Nat
-> Nat
418. builtin.Int.signum : Int
419. builtin.Int.signum : Int
-> Int
419. builtin.Float.sin : Float
420. builtin.Float.sin : Float
-> Float
420. builtin.Float.sinh : Float
421. builtin.Float.sinh : Float
-> Float
421. builtin.Bytes.size : Bytes
422. builtin.Bytes.size : Bytes
-> Nat
422. builtin.ImmutableArray.size : ImmutableArray
423. builtin.ImmutableArray.size : ImmutableArray
a
-> Nat
423. builtin.ImmutableByteArray.size : ImmutableByteArray
424. builtin.ImmutableByteArray.size : ImmutableByteArray
-> Nat
424. builtin.List.size : [a]
425. builtin.List.size : [a]
-> Nat
425. builtin.MutableArray.size : MutableArray
426. builtin.MutableArray.size : MutableArray
g a
-> Nat
426. builtin.MutableByteArray.size : MutableByteArray
427. builtin.MutableByteArray.size : MutableByteArray
g
-> Nat
427. builtin.Text.size : Text
428. builtin.Text.size : Text
-> Nat
428. builtin.Text.patterns.space : Pattern
429. builtin.Text.patterns.space : Pattern
Text
429. builtin.Float.sqrt : Float
430. builtin.Float.sqrt : Float
-> Float
430. builtin.io2.IO.process.start : Text
431. builtin.io2.IO.process.start : Text
-> [Text]
->{IO} ( Handle,
Handle,
Handle,
ProcessHandle)
431. builtin.io2.IO.stdHandle : StdHandle
432. builtin.io2.IO.stdHandle : StdHandle
-> Handle
432. builtin.Nat.sub : Nat
433. builtin.Nat.sub : Nat
-> Nat
-> Int
433. builtin.io2.TVar.swap : TVar a
434. builtin.io2.TVar.swap : TVar a
-> a
->{STM} a
434. builtin.io2.IO.systemTimeMicroseconds : '{IO} Int
435. builtin.Bytes.take : Nat
435. builtin.io2.IO.systemTimeMicroseconds : '{IO} Int
436. builtin.Bytes.take : Nat
-> Bytes
-> Bytes
436. builtin.List.take : Nat
437. builtin.List.take : Nat
-> [a]
-> [a]
437. builtin.Text.take : Nat
438. builtin.Text.take : Nat
-> Text
-> Text
438. builtin.Float.tan : Float
439. builtin.Float.tan : Float
-> Float
439. builtin.Float.tanh : Float
440. builtin.Float.tanh : Float
-> Float
440. builtin.io2.Clock.internals.threadCPUTime : '{IO} Either
441. builtin.io2.Clock.internals.threadCPUTime : '{IO} Either
Failure
TimeSpec
441. builtin.Bytes.toBase16 : Bytes
442. builtin.Bytes.toBase16 : Bytes
-> Bytes
442. builtin.Bytes.toBase32 : Bytes
443. builtin.Bytes.toBase32 : Bytes
-> Bytes
443. builtin.Bytes.toBase64 : Bytes
444. builtin.Bytes.toBase64 : Bytes
-> Bytes
444. builtin.Bytes.toBase64UrlUnpadded : Bytes
445. builtin.Bytes.toBase64UrlUnpadded : Bytes
-> Bytes
445. builtin.Text.toCharList : Text
446. builtin.Text.toCharList : Text
-> [Char]
446. builtin.Int.toFloat : Int
447. builtin.Int.toFloat : Int
-> Float
447. builtin.Nat.toFloat : Nat
448. builtin.Nat.toFloat : Nat
-> Float
448. builtin.Nat.toInt : Nat
449. builtin.Nat.toInt : Nat
-> Int
449. builtin.Bytes.toList : Bytes
450. builtin.Bytes.toList : Bytes
-> [Nat]
450. builtin.Text.toLowercase : Text
451. builtin.Text.toLowercase : Text
-> Text
451. builtin.Char.toNat : Char
452. builtin.Char.toNat : Char
-> Nat
452. builtin.Float.toRepresentation : Float
453. builtin.Float.toRepresentation : Float
-> Nat
453. builtin.Int.toRepresentation : Int
454. builtin.Int.toRepresentation : Int
-> Nat
454. builtin.Char.toText : Char
455. builtin.Char.toText : Char
-> Text
455. builtin.Debug.toText : a
456. builtin.Debug.toText : a
-> Optional
(Either
Text
Text)
456. builtin.Float.toText : Float
457. builtin.Float.toText : Float
-> Text
457. builtin.Handle.toText : Handle
458. builtin.Handle.toText : Handle
-> Text
458. builtin.Int.toText : Int
459. builtin.Int.toText : Int
-> Text
459. builtin.Nat.toText : Nat
460. builtin.Nat.toText : Nat
-> Text
460. builtin.Socket.toText : Socket
461. builtin.Socket.toText : Socket
-> Text
461. builtin.Link.Term.toText : Term
462. builtin.Link.Term.toText : Term
-> Text
462. builtin.ThreadId.toText : ThreadId
463. builtin.ThreadId.toText : ThreadId
-> Text
463. builtin.Text.toUppercase : Text
464. builtin.Text.toUppercase : Text
-> Text
464. builtin.Text.toUtf8 : Text
465. builtin.Text.toUtf8 : Text
-> Bytes
465. builtin.todo : a -> b
466. builtin.Debug.trace : Text
466. builtin.todo : a -> b
467. builtin.Debug.trace : Text
-> a
-> ()
467. builtin.Int.trailingZeros : Int
468. builtin.Int.trailingZeros : Int
-> Nat
468. builtin.Nat.trailingZeros : Nat
469. builtin.Nat.trailingZeros : Nat
-> Nat
469. builtin.Float.truncate : Float
470. builtin.Float.truncate : Float
-> Int
470. builtin.Int.truncate0 : Int
471. builtin.Int.truncate0 : Int
-> Nat
471. builtin.io2.IO.tryEval : '{IO} a
472. builtin.io2.IO.tryEval : '{IO} a
->{IO,
Exception} a
472. builtin.io2.Promise.tryRead : Promise
473. builtin.io2.Promise.tryRead : Promise
a
->{IO} Optional
a
473. builtin.io2.MVar.tryTake : MVar a
474. builtin.io2.MVar.tryTake : MVar a
->{IO} Optional
a
474. builtin.Text.uncons : Text
475. builtin.Text.uncons : Text
-> Optional
( Char,
Text)
475. builtin.Any.unsafeExtract : Any
476. builtin.Any.unsafeExtract : Any
-> a
476. builtin.Text.unsnoc : Text
477. builtin.Text.unsnoc : Text
-> Optional
( Text,
Char)
477. builtin.Code.validate : [( Term,
478. builtin.Code.validate : [( Term,
Code)]
->{IO} Optional
Failure
478. builtin.io2.validateSandboxed : [Term]
479. builtin.io2.validateSandboxed : [Term]
-> a
-> Boolean
479. builtin.Value.value : a
480. builtin.Value.value : a
-> Value
480. builtin.io2.IO.process.wait : ProcessHandle
481. builtin.io2.IO.process.wait : ProcessHandle
->{IO} Nat
481. builtin.Debug.watch : Text
482. builtin.Debug.watch : Text
-> a
-> a
482. builtin.MutableArray.write : MutableArray
483. builtin.MutableArray.write : MutableArray
g a
-> Nat
-> a
->{g,
Exception} ()
483. builtin.io2.Promise.write : Promise
484. builtin.io2.Promise.write : Promise
a
-> a
->{IO} Boolean
484. builtin.Ref.write : Ref g a
485. builtin.Ref.write : Ref g a
-> a
->{g} ()
485. builtin.io2.TVar.write : TVar a
486. builtin.io2.TVar.write : TVar a
-> a
->{STM} ()
486. builtin.MutableByteArray.write16be : MutableByteArray
487. builtin.MutableByteArray.write16be : MutableByteArray
g
-> Nat
-> Nat
->{g,
Exception} ()
487. builtin.MutableByteArray.write32be : MutableByteArray
488. builtin.MutableByteArray.write32be : MutableByteArray
g
-> Nat
-> Nat
->{g,
Exception} ()
488. builtin.MutableByteArray.write64be : MutableByteArray
489. builtin.MutableByteArray.write64be : MutableByteArray
g
-> Nat
-> Nat
->{g,
Exception} ()
489. builtin.MutableByteArray.write8 : MutableByteArray
490. builtin.MutableByteArray.write8 : MutableByteArray
g
-> Nat
-> Nat
->{g,
Exception} ()
490. builtin.Int.xor : Int
491. builtin.Int.xor : Int
-> Int
-> Int
491. builtin.Nat.xor : Nat
492. builtin.Nat.xor : Nat
-> Nat
-> Nat

View File

@ -59,17 +59,17 @@ y = 2
most recent, along with the command that got us there. Try:
`fork 2 .old`
`fork #bu6c7lmbfc .old` to make an old namespace
`fork #2b8npf0tu2 .old` to make an old namespace
accessible again,
`reset-root #bu6c7lmbfc` to reset the root namespace and
`reset-root #2b8npf0tu2` to reset the root namespace and
its history to that of the
specified namespace.
When Root Hash Action
1. now #cl7pneoh0i add
2. now #bu6c7lmbfc add
3. now #s0g21i3u0g builtins.merge
1. now #j967usn5hk add
2. now #2b8npf0tu2 add
3. now #lv9og66mct builtins.merge
4. #sg60bvjo91 history starts here
Tip: Use `diff.namespace 1 7` to compare namespaces between

View File

@ -13,7 +13,7 @@ Let's look at some examples. We'll start with a namespace with just the builtins
□ 1. #d8s9u1138r (start of history)
□ 1. #a2uij441jg (start of history)
.> fork builtin builtin2
@ -42,21 +42,21 @@ Now suppose we `fork` a copy of builtin, then rename `Nat.+` to `frobnicate`, th
Note: The most recent namespace hash is immediately below this
message.
⊙ 1. #lb60fofgfp
⊙ 1. #2orc0vqqcv
> Moves:
Original name New name
Nat.frobnicate Nat.+
⊙ 2. #vn8dtrgv6r
⊙ 2. #fk0nmiqqgk
> Moves:
Original name New name
Nat.+ Nat.frobnicate
□ 3. #d8s9u1138r (start of history)
□ 3. #a2uij441jg (start of history)
```
If we merge that back into `builtin`, we get that same chain of history:
@ -71,21 +71,21 @@ If we merge that back into `builtin`, we get that same chain of history:
Note: The most recent namespace hash is immediately below this
message.
⊙ 1. #lb60fofgfp
⊙ 1. #2orc0vqqcv
> Moves:
Original name New name
Nat.frobnicate Nat.+
⊙ 2. #vn8dtrgv6r
⊙ 2. #fk0nmiqqgk
> Moves:
Original name New name
Nat.+ Nat.frobnicate
□ 3. #d8s9u1138r (start of history)
□ 3. #a2uij441jg (start of history)
```
Let's try again, but using a `merge.squash` (or just `squash`) instead. The history will be unchanged:
@ -106,7 +106,7 @@ Let's try again, but using a `merge.squash` (or just `squash`) instead. The hist
□ 1. #d8s9u1138r (start of history)
□ 1. #a2uij441jg (start of history)
```
The churn that happened in `mybuiltin` namespace ended up back in the same spot, so the squash merge of that namespace with our original namespace had no effect.
@ -485,13 +485,13 @@ This checks to see that squashing correctly preserves deletions:
Note: The most recent namespace hash is immediately below this
message.
⊙ 1. #8i72q7ac2u
⊙ 1. #9ijnd9ip7o
- Deletes:
Nat.* Nat.+
□ 2. #d8s9u1138r (start of history)
□ 2. #a2uij441jg (start of history)
```
Notice that `Nat.+` and `Nat.*` are deleted by the squash, and we see them deleted in one atomic step in the history.

View File

@ -108,7 +108,8 @@ data Error v
| UnknownType (L.Token (HQ.HashQualified Name)) (Set Reference)
| UnknownId (L.Token (HQ.HashQualified Name)) (Set Referent) (Set Reference)
| ExpectedBlockOpen String (L.Token L.Lexeme)
| EmptyMatch (L.Token ())
| -- Indicates a cases or match/with which doesn't have any patterns
EmptyMatch (L.Token ())
| EmptyWatch Ann
| UseInvalidPrefixSuffix (Either (L.Token Name) (L.Token Name)) (Maybe [L.Token Name])
| UseEmpty (L.Token String) -- an empty `use` statement
@ -238,7 +239,7 @@ importDotId = queryToken go
-- Consume a virtual semicolon
semi :: Ord v => P v (L.Token ())
semi = queryToken go
semi = label "newline or semicolon" $ queryToken go
where
go (L.Semi _) = Just ()
go _ = Nothing