Update cli example platform

This commit is contained in:
Richard Feldman 2021-04-03 22:03:18 -04:00
parent 6dcea4f151
commit 7b70e9b0e4
6 changed files with 43 additions and 36 deletions

View file

@ -1,12 +1,16 @@
app "echo" app "echo"
packages { base: "platform/" } packages { base: "platform" }
imports [ base.Task.{ after }, base.Stdout, base.Stdin ] imports [ base.Task.{ await }, base.Stdout, base.Stdin ]
provides [ main ] to base provides [ main ] to base
main : Task.Task {} * main : Task.Task {} *
main = main =
after (Stdout.line "What's your first name?") \{} -> {} <- await (Stdout.line "What's your first name?")
after Stdin.line \firstName ->
after (Stdout.line "What's your last name?") \{} -> firstName <- await Stdin.line
after Stdin.line \lastName ->
Stdout.line "Hi, \(firstName) \(lastName)!" {} <- await (Stdout.line "What's your last name?")
lastName <- await Stdin.line
Stdout.line "Hi, \(firstName) \(lastName)!"

View file

@ -1,10 +1,10 @@
platform folkertdev/foo platform rtfeldman/roc-cli
requires { main : ThisIsTotallyIgnoredApparently } # TODO FIXME requires { main : Task.Task {} * } # TODO FIXME
exposes [] # TODO FIXME actually expose modules exposes [] # TODO FIXME actually expose modules
packages {} packages {}
imports [ Task ] # TODO FIXME Task.{ Task } imports [ Task ] # TODO FIXME Task.{ Task }
provides [ mainForHost ] provides [ mainForHost ]
effects Effect effects fx.Effect
{ {
putChar : I64 -> Effect {}, putChar : I64 -> Effect {},
putLine : Str -> Effect {}, putLine : Str -> Effect {},

View file

@ -1,6 +1,6 @@
interface Stdin interface Stdin
exposes [ line ] exposes [ line ]
imports [ Effect, Task ] imports [ fx.Effect, Task ]
line : Task.Task Str * line : Task.Task Str *
line = Effect.after Effect.getLine Task.always # TODO FIXME Effect.getLine should suffice line = Effect.after Effect.getLine Task.succeed # TODO FIXME Effect.getLine should suffice

View file

@ -1,6 +1,6 @@
interface Stdout interface Stdout
exposes [ line ] exposes [ line ]
imports [ Effect, Task ] # TODO FIXME Task.{ Task } imports [ fx.Effect, Task ] # TODO FIXME Task.{ Task }
line : Str -> Task.Task {} * line : Str -> Task.Task {} *
line = \str -> Effect.map (Effect.putLine str) (\_ -> Ok {}) line = \str -> Effect.map (Effect.putLine str) (\_ -> Ok {})

View file

@ -1,31 +1,34 @@
interface Task interface Task
exposes [ Task, after, always, fail, map, putLine, getLine ] exposes [ Task, succeed, fail, await, map, putLine ]
imports [ Effect ] imports [ fx.Effect ]
Task a err : Effect.Effect (Result a err)
always : a -> Task a * Task ok err : Effect.Effect (Result ok err)
always = \x -> Effect.always (Ok x)
succeed : val -> Task val *
succeed = \val ->
Effect.always (Ok val)
fail : err -> Task * err fail : err -> Task * err
fail = \x -> Effect.always (Err x) fail = \val ->
Effect.always (Err val)
getLine : Task Str *
getLine = Effect.after Effect.getLine always await : Task a err, (a -> Task b err) -> Task b err
await = \effect, transform ->
Effect.after effect \result ->
when result is
Ok a -> transform a
Err err -> Task.fail err
map : Task a err, (a -> b) -> Task b err
map = \effect, transform ->
Effect.after effect \result ->
when result is
Ok a -> Task.succeed (transform a)
Err err -> Task.fail err
putLine : Str -> Task {} * putLine : Str -> Task {} *
putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {}) putLine = \line -> Effect.map (Effect.putLine line) (\_ -> Ok {})
map : Task a err, (a -> b) -> Task b err
map = \task, transform ->
Effect.map task \res ->
when res is
Ok x -> Ok (transform x)
Err e -> Err e
after : Task a err, (a -> Task b err) -> Task b err
after = \task, transform ->
Effect.after task \res ->
when res is
Ok x -> transform x
Err e -> Task.fail e

View file

@ -52,7 +52,7 @@ pub fn roc_fx_getLine() -> RocStr {
let stdin = io::stdin(); let stdin = io::stdin();
let line1 = stdin.lock().lines().next().unwrap().unwrap(); let line1 = stdin.lock().lines().next().unwrap().unwrap();
RocStr::from_slice_with_capacity(line1.as_bytes(), line1.len()) RocStr::from_slice(line1.as_bytes())
} }
unsafe fn call_the_closure(function_pointer: *const u8, closure_data_ptr: *const u8) -> i64 { unsafe fn call_the_closure(function_pointer: *const u8, closure_data_ptr: *const u8) -> i64 {