add other effect functions

This commit is contained in:
Folkert 2020-12-11 20:46:46 +01:00
parent 539f173472
commit f1b4d535c6
4 changed files with 38 additions and 18 deletions

View file

@ -4749,10 +4749,33 @@ fn reuse_function_symbol<'a>(
) -> Stmt<'a> { ) -> Stmt<'a> {
match procs.partial_procs.get(&original) { match procs.partial_procs.get(&original) {
None => { None => {
// danger: a foreign symbol may not be specialized! let is_imported =
debug_assert!( !(env.home == original.module_id() || original.module_id() == ModuleId::ATTR);
env.home == original.module_id() || original.module_id() == ModuleId::ATTR
); match arg_var {
Some(arg_var) if is_imported => {
let layout = layout_cache
.from_var(env.arena, arg_var, env.subs)
.expect("creating layout does not fail");
procs.insert_passed_by_name(
env,
arg_var,
original,
layout.clone(),
layout_cache,
);
}
_ => {
// danger: a foreign symbol may not be specialized!
debug_assert!(
!is_imported,
"symbol {:?} while processing module {:?}",
original,
(env.home, &arg_var),
);
}
}
result result
} }

View file

@ -4,6 +4,5 @@ app "effect-example"
provides [ main ] to base provides [ main ] to base
main : Task.Task {} F64 main : Task.Task {} F64
main = main =
# Task.after (Task.always "foo") (\_ -> Task.always {}) Task.after (Task.getLine {}) \lineThisThing -> Task.putLine lineThisThing
Task.after (Task.putLine "foo") \{} -> Task.putLine "bar"

View file

@ -2,20 +2,15 @@ platform folkertdev/foo
requires { main : Effect {} } requires { main : Effect {} }
exposes [] exposes []
packages {} packages {}
imports [] imports [Task]
provides [ mainForHost ] provides [ mainForHost ]
effects Effect effects Effect
{ {
putLine : Str -> Effect {} putChar : I64 -> Effect {},
putLine : Str -> Effect {},
getLine : {} -> Effect Str
} }
# putChar : I64 -> Effect {}, mainForHost : Task.Task {} F64 as Fx
# getLine : Effect Str
Effect a : [ Effect ({} -> a) ]
Task a err : Effect (Result a err)
mainForHost : Task {} F64 as Fx
mainForHost = main mainForHost = main

View file

@ -1,5 +1,5 @@
interface Task interface Task
exposes [ Task, after, always, fail, putLine, map ] exposes [ Task, after, always, fail, map, putLine, getLine ]
imports [ Effect ] imports [ Effect ]
Task a err : Effect.Effect (Result a err) Task a err : Effect.Effect (Result a err)
@ -10,6 +10,9 @@ always = \x -> Effect.always (Ok x)
fail : err -> Task * err fail : err -> Task * err
fail = \x -> Effect.always (Err x) fail = \x -> Effect.always (Err x)
getLine : {} -> Task Str *
getLine = \{} -> Effect.after (Effect.getLine {}) always
putLine : Str -> Task {} * putLine : Str -> Task {} *
putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {}) putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {})