Skip to content

Commit

Permalink
Merge pull request #16 from lukewilliamboswell/update-new-syntax
Browse files Browse the repository at this point in the history
Update new module syntax
  • Loading branch information
lukewilliamboswell committed May 3, 2024
2 parents e5264e6 + 1f5def4 commit 9ab469b
Show file tree
Hide file tree
Showing 10 changed files with 436 additions and 456 deletions.
34 changes: 15 additions & 19 deletions examples/csv-movies.roc
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
app "example"
packages {
cli: "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}
imports [
cli.Task,
cli.Stdout,
cli.Stderr,
parser.Core.{ Parser, map, keep },
parser.String.{ strFromUtf8 },
parser.CSV.{ CSV },
]
provides [main] to cli
app [main] {
cli: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}

import parser.Core as P
import parser.CSV
import parser.String
import cli.Stdout
import cli.Stderr

MovieInfo := { title : Str, releaseYear : U64, actors : List Str }

Expand Down Expand Up @@ -39,7 +35,7 @@ main =
Stderr.line "Parsing failure: $(failure)\n"

ParsingIncomplete leftover ->
leftoverStr = leftover |> List.map strFromUtf8 |> List.map (\val -> "\"$(val)\"") |> Str.joinWith ", "
leftoverStr = leftover |> List.map String.strFromUtf8 |> List.map (\val -> "\"$(val)\"") |> Str.joinWith ", "

Stderr.line "Parsing incomplete. Following leftover fields while parsing a record: $(leftoverStr)\n"

Expand All @@ -48,13 +44,13 @@ main =

movieInfoParser =
CSV.record (\title -> \releaseYear -> \actors -> @MovieInfo { title, releaseYear, actors })
|> keep (CSV.field CSV.string)
|> keep (CSV.field CSV.u64)
|> keep (CSV.field actorsParser)
|> P.keep (CSV.field CSV.string)
|> P.keep (CSV.field CSV.u64)
|> P.keep (CSV.field actorsParser)

actorsParser =
CSV.string
|> map \val -> Str.split val ","
|> P.map \val -> Str.split val ","

movieInfoExplanation = \@MovieInfo { title, releaseYear, actors } ->
enumeratedActors = enumerate actors
Expand Down
36 changes: 16 additions & 20 deletions examples/letters.roc
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
app "example"
packages {
cli: "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}
imports [
cli.Task,
cli.Stdout,
cli.Stderr,
parser.Core.{ Parser, buildPrimitiveParser, many },
parser.String.{ parseStr },
]
provides [main] to cli
app [main] {
cli: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}

import cli.Task
import cli.Stdout
import cli.Stderr
import parser.Core
import parser.String

main =

result : Result (List Letter) [ParsingFailure Str, ParsingIncomplete Str]
result = parseStr (many letterParser) "AAAiBByAABBwBtCCCiAyArBBx"
result = String.parseStr (Core.many letterParser) "AAAiBByAABBwBtCCCiAyArBBx"

when result |> Result.map countLetterAs is
Ok count -> Stdout.line "I counted $(Num.toStr count) letter A's!"
Expand All @@ -35,9 +32,8 @@ countLetterAs = \letters ->
|> List.sum

# Build a custom parser to convert utf8 input into Letter tags
letterParser : Parser (List U8) Letter
letterParser =
input <- buildPrimitiveParser
letterParser : Core.Parser (List U8) Letter
letterParser = Core.buildPrimitiveParser \input ->

valResult =
when input is
Expand All @@ -54,12 +50,12 @@ letterParser =
expect
input = "B"
parser = letterParser
result = parseStr parser input
result = String.parseStr parser input
result == Ok B

# Test we can parse a number of different letters
expect
input = "BCXA"
parser = many letterParser
result = parseStr parser input
parser = Core.many letterParser
result = String.parseStr parser input
result == Ok [B, C, Other, A]
25 changes: 11 additions & 14 deletions examples/markdown.roc
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
app "example"
packages {
cli: "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}
imports [
cli.Task,
cli.Stdout,
parser.String.{ parseStr },
parser.Markdown.{ Markdown },
]
provides [main] to cli
app [main] {
cli: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}

import cli.Task
import cli.Stdout
import parser.String
import parser.Markdown

content : Str
content =
Expand All @@ -29,12 +26,12 @@ content =
"""

main =
parseStr Markdown.all content
String.parseStr Markdown.all content
|> Result.map \nodes -> renderContent "" nodes
|> Result.withDefault "PARSING ERROR"
|> Stdout.line

renderContent : Str, List Markdown -> Str
renderContent : Str, List Markdown.Markdown -> Str
renderContent = \acc, nodes ->
when nodes is
[] -> acc
Expand Down
45 changes: 21 additions & 24 deletions examples/numbers.roc
Original file line number Diff line number Diff line change
@@ -1,46 +1,43 @@
app "example"
packages {
cli: "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}
imports [
cli.Task,
cli.Stdout,
cli.Stderr,
parser.Core.{ Parser, many, const, skip, keep },
parser.String.{ parseStr, digits, string },
]
provides [main] to cli
app [main] {
cli: platform "https://github.com/roc-lang/basic-cli/releases/download/0.10.0/vNe6s9hWzoTZtFmNkvEICPErI9ptji_ySjicO6CkucY.tar.br",
parser: "../package/main.roc",
}

import cli.Task
import cli.Stdout
import cli.Stderr
import parser.Core
import parser.String

main =

result : Result (List (List U64)) [ParsingFailure Str, ParsingIncomplete Str]
result = parseStr (many multipleNumbers) "1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n"
result = String.parseStr (Core.many multipleNumbers) "1000\n2000\n3000\n\n4000\n\n5000\n6000\n\n"

when result |> Result.map largest is
Ok count -> Stdout.line "The lagest sum is $(Num.toStr count)"
Err _ -> Stderr.line "Failed while parsing input"

# Parse a number followed by a newline
singleNumber : Parser (List U8) U64
singleNumber : Core.Parser (List U8) U64
singleNumber =
const (\n -> n)
|> keep (digits)
|> skip (string "\n")
Core.const (\n -> n)
|> Core.keep (String.digits)
|> Core.skip (String.string "\n")

expect
actual = parseStr singleNumber "1000\n"
actual = String.parseStr singleNumber "1000\n"
actual == Ok 1000

# Parse a series of numbers followed by a newline
multipleNumbers : Parser (List U8) (List U64)
multipleNumbers : Core.Parser (List U8) (List U64)
multipleNumbers =
const (\ns -> ns)
|> keep (many singleNumber)
|> skip (string "\n")
Core.const (\ns -> ns)
|> Core.keep (Core.many singleNumber)
|> Core.skip (String.string "\n")

expect
actual = parseStr multipleNumbers "1000\n2000\n3000\n\n"
actual = String.parseStr multipleNumbers "1000\n2000\n3000\n\n"
actual == Ok [1000, 2000, 3000]

# Sum up the lists and return the largest sum
Expand Down
Loading

0 comments on commit 9ab469b

Please sign in to comment.