From 36a993eb96b24e93780175c5df8b868f2a9f31d8 Mon Sep 17 00:00:00 2001 From: Orion Kindel Date: Fri, 6 Oct 2023 19:36:55 -0500 Subject: [PATCH] doc --- exercise-purs/.gitignore | 12 +++ exercise-purs/spago.yaml | 16 ++++ exercise-purs/src/Data.CSV.purs | 89 +++++++++++++++++++++ exercise-purs/src/Main.purs | 11 +++ exercise-purs/test/Test/Main.purs | 12 +++ exercise-rs/Cargo.toml | 8 ++ exercise-rs/src/main.rs | 3 + readme.md | 129 +++++++++++++++++++++++++++++- 8 files changed, 277 insertions(+), 3 deletions(-) create mode 100644 exercise-purs/.gitignore create mode 100644 exercise-purs/spago.yaml create mode 100644 exercise-purs/src/Data.CSV.purs create mode 100644 exercise-purs/src/Main.purs create mode 100644 exercise-purs/test/Test/Main.purs create mode 100644 exercise-rs/Cargo.toml create mode 100644 exercise-rs/src/main.rs diff --git a/exercise-purs/.gitignore b/exercise-purs/.gitignore new file mode 100644 index 0000000..c470536 --- /dev/null +++ b/exercise-purs/.gitignore @@ -0,0 +1,12 @@ + +bower_components/ +node_modules/ +.pulp-cache/ +output/ +output-es/ +generated-docs/ +.psc-package/ +.psc* +.purs* +.psa* +.spago diff --git a/exercise-purs/spago.yaml b/exercise-purs/spago.yaml new file mode 100644 index 0000000..dfb0768 --- /dev/null +++ b/exercise-purs/spago.yaml @@ -0,0 +1,16 @@ +package: + dependencies: + - arrays + - console + - effect + - ordered-collections + - parsing + - prelude + name: foo + test: + dependencies: [] + main: Test.Main +workspace: + extra_packages: {} + package_set: + registry: 42.2.1 diff --git a/exercise-purs/src/Data.CSV.purs b/exercise-purs/src/Data.CSV.purs new file mode 100644 index 0000000..b935bc8 --- /dev/null +++ b/exercise-purs/src/Data.CSV.purs @@ -0,0 +1,89 @@ +module Data.CSV where + +import Prelude hiding (between) + +import Control.Alt ((<|>)) +import Data.Array (some) +import Data.Either (Either) +import Data.Foldable (all) +import Data.List (List(..)) +import Data.List.NonEmpty (NonEmptyList, zip) +import Data.Map as M +import Data.String.CodeUnits (fromCharArray, toCharArray, singleton) +import Parsing (ParseError, Parser, runParser) +import Parsing.Combinators (sepEndBy, sepBy1, between) +import Parsing.String (eof, satisfy, string) + +type P a = Parser String a + +type Parsers a = + { + quoted :: (P a -> P a), + chars :: P String, + qchars :: P String, + field :: P String, + row :: P (NonEmptyList String), + file :: P (List (NonEmptyList String)), + fileHeaded :: P (List (M.Map String String)) + } + +makeQuoted :: forall a. String -> (P a -> P a) +makeQuoted q = between (string q) (string q) + +makeChars :: String -> P String +makeChars xs = do + fromCharArray <$> some char + where + char = satisfy $ excluded xs + excluded ys = \x -> all identity $ terms ys <*> [x] + terms ys = map (/=) $ toCharArray ys + +makeQchars :: Char -> P String +makeQchars c = fromCharArray <$> some (qchar <|> escapedQuote) + where + escapedQuote :: P Char + escapedQuote = (string $ (singleton c <> singleton c)) $> c + qchar = satisfy (\c' -> c' /= c) + +makeField :: (P String -> P String) -> P String -> P String -> P String +makeField qoutes qoutedChars purechars = qoutes qoutedChars <|> purechars <|> string "" + +makeRow :: String -> P String -> P (NonEmptyList String) +makeRow s f = f `sepBy1` string s + +makeFile :: String -> P (NonEmptyList String) -> P (List (NonEmptyList String)) +makeFile s r = r `sepEndBy` string s <* eof + +makeFileHeaded :: P (List (NonEmptyList String)) -> P (List (M.Map String String)) +makeFileHeaded file = do + f <- file + pure $ case f of + Nil -> Nil + Cons header rows -> mkRow header <$> rows + where + mkRow header row' = M.fromFoldable $ zip header row' + +makeParsers :: Char -> String -> String -> Parsers String +makeParsers quote seperator eol = do + let quoted' = makeQuoted $ singleton quote + let chars' = makeChars $ (singleton quote) <> seperator <> eol + let qchars' = makeQchars quote + let field' = makeField quoted' qchars' chars' + let row' = makeRow seperator field' + let file' = makeFile eol row' + let fileHeaded' = makeFileHeaded file' + { + quoted: quoted', + chars: chars', + qchars: qchars', + field: field', + row: row', + file: file', + fileHeaded: fileHeaded' + } + +defaultParsers :: Parsers String +defaultParsers = makeParsers '"' "," "\n" + +parse :: String -> Either ParseError (List (NonEmptyList String)) +parse = flip runParser $ defaultParsers.file diff --git a/exercise-purs/src/Main.purs b/exercise-purs/src/Main.purs new file mode 100644 index 0000000..a4363b8 --- /dev/null +++ b/exercise-purs/src/Main.purs @@ -0,0 +1,11 @@ +module Main where + +import Prelude + +import Effect (Effect) +import Effect.Console (log) + +main :: Effect Unit +main = do + log "🍝" + diff --git a/exercise-purs/test/Test/Main.purs b/exercise-purs/test/Test/Main.purs new file mode 100644 index 0000000..e616930 --- /dev/null +++ b/exercise-purs/test/Test/Main.purs @@ -0,0 +1,12 @@ +module Test.Main where + +import Prelude + +import Effect (Effect) +import Effect.Class.Console (log) + +main :: Effect Unit +main = do + log "🍕" + log "You should add some tests." + diff --git a/exercise-rs/Cargo.toml b/exercise-rs/Cargo.toml new file mode 100644 index 0000000..eda9ea2 --- /dev/null +++ b/exercise-rs/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "exercise-rs" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/exercise-rs/src/main.rs b/exercise-rs/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/exercise-rs/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/readme.md b/readme.md index ddb36f1..74b8c84 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,21 @@ # thunderstrike.ai intern resources +## contents +* [rust](#rust) + * [in brief](#rust-in-brief) +* [purescript](#purescript) + * [in brief](#purescript-in-brief) + * [example - frontend app](#purescript-example-frontend-app) +* [optional exercise](#exercise) + * [setup](#exercise-setup) + * [task](#exercise-task) +* [further reading](#further-reading) + ## rust **Rust** is a strongly-typed [type safety] systems programming language [systems programming language]. -### In brief +### Rust in brief