@@ -17,7 +17,11 @@ | |||
"purescript-transformers": "^4.2.0", | |||
"purescript-js-timers": "^4.0.1", | |||
"purescript-js-date": "^6.0.0", | |||
"purescript-arrays": "^5.2.1" | |||
"purescript-arrays": "^5.2.1", | |||
"purescript-stringutils": "^0.0.8", | |||
"purescript-strings": "^4.0.1", | |||
"purescript-record": "^2.0.0", | |||
"purescript-ordered-collections": "^1.6.1" | |||
}, | |||
"devDependencies": { | |||
"purescript-psci-support": "^4.0.0" | |||
@@ -21,7 +21,7 @@ import Web.DOM.Internal.Types (NodeList, Element) | |||
import Web.DOM.Node as DOMNode | |||
import Web.DOM.NodeList as NodeList | |||
import Web.DOM.ParentNode (ParentNode, QuerySelector(..)) | |||
import Web.DOM.ParentNode as WebDOM | |||
import Web.DOM.ParentNode as ParentNode | |||
import Web.Event.Event as Event | |||
import Web.Event.EventTarget (EventListener, EventTarget) | |||
import Web.Event.EventTarget as EventTarget | |||
@@ -47,7 +47,7 @@ getElements | |||
=> ReaderT { parentNode :: ParentNode, className :: String } m NodeList | |||
getElements = do | |||
{parentNode, className} <- ask | |||
elements <- EffectClass.liftEffect $ WebDOM.querySelectorAll (QuerySelector className) parentNode | |||
elements <- EffectClass.liftEffect $ ParentNode.querySelectorAll (QuerySelector className) parentNode | |||
pure elements | |||
effParentNode :: Effect { parentNode :: ParentNode, document :: Document } | |||
@@ -0,0 +1,3 @@ | |||
exports.logTableImpl = function(a) { | |||
return console.table(a); | |||
}; |
@@ -0,0 +1,109 @@ | |||
module ArrayCardioDay1 where | |||
-- Base | |||
import Control.Monad.Reader(ReaderT, ask, runReaderT) | |||
import Data.Array (filter, sortBy, (!!)) | |||
import Data.Maybe (Maybe(..)) | |||
import Data.String.Common (split) | |||
import Data.String.Pattern (Pattern(..)) | |||
import Data.Traversable (foldr, traverse) | |||
import Prelude | |||
import Data.String.Utils as StringUtils | |||
import Data.Map (Map) | |||
import Data.Map as Map | |||
-- Effect | |||
import Effect (Effect) | |||
import Effect.Class (class MonadEffect) | |||
import Effect.Class as EffectClass | |||
import Effect.Console (logShow) | |||
import Effect.Uncurried (EffectFn1, runEffectFn1) | |||
-- DOM | |||
import Web.DOM.Internal.Types (Element, NodeList) | |||
import Web.DOM.Node as Node | |||
import Web.DOM.NodeList as NodeList | |||
import Web.DOM.ParentNode (QuerySelector(..), ParentNode) | |||
import Web.DOM.ParentNode as ParentNode | |||
import Web.HTML as HTML | |||
import Web.HTML.HTMLDocument as HTMLDocument | |||
import Web.HTML.Window as Window | |||
-- test data | |||
import ExerciseData (Inventor, ranData, people, inventorList) | |||
foreign import logTableImpl :: forall a. EffectFn1 a Unit | |||
logTable :: forall a. a -> Effect Unit | |||
logTable a = runEffectFn1 logTableImpl a | |||
effParentNode :: Effect ParentNode | |||
effParentNode = | |||
HTML.window >>= Window.document >>= pure <<< HTMLDocument.toParentNode | |||
-- Notes: toParentNode :: Element -> ParentNode | |||
getElement | |||
:: forall m. Bind m | |||
=> MonadEffect m | |||
=> ReaderT { parentNode :: ParentNode, targetElement :: String } m (Maybe Element) | |||
getElement = do | |||
{ parentNode, targetElement } <- ask | |||
pure =<< EffectClass.liftEffect $ ParentNode.querySelector (QuerySelector targetElement) parentNode | |||
getElements | |||
:: forall m. Bind m | |||
=> MonadEffect m | |||
=> ReaderT { parentNode :: ParentNode, targetElement :: String } m NodeList | |||
getElements = do | |||
{ parentNode, targetElement } <- ask | |||
pure =<< EffectClass.liftEffect $ ParentNode.querySelectorAll (QuerySelector targetElement) parentNode | |||
bornBy1500 :: Array Inventor -> Array Inventor | |||
bornBy1500 = filter (isBortBetween 1500 1600) | |||
where isBortBetween startDate endDate inventor = | |||
inventor.year >= startDate && inventor.year <= endDate | |||
fullNames :: Array Inventor -> Array String | |||
fullNames = map (\inv -> inv.first <> " " <> inv.last) | |||
orderedByYear :: Array Inventor -> Array Inventor | |||
orderedByYear = sortBy (\a b -> compare a.year b.year) | |||
totalYears :: Array Inventor -> Int | |||
totalYears = foldr (\b a -> a + (b.passed - b.year)) 0 | |||
orderedByOldest :: Array Inventor -> Array Inventor | |||
orderedByOldest = | |||
sortBy (\a b -> | |||
if (a.passed - a.year) > (b.passed - b.year) | |||
then LT | |||
else GT) | |||
alpha :: Array String -> Array String | |||
alpha = | |||
sortBy (\a b -> | |||
case (split (Pattern ", ") a) !! 0 of | |||
Nothing -> LT | |||
Just aLast -> | |||
case (split (Pattern ", ") b) !! 0 of | |||
Nothing -> LT | |||
Just bLast -> compare aLast bLast | |||
) | |||
transportation :: Array String -> Map String Int | |||
transportation = foldr (\a b -> Map.insertWith (\n _ -> n + 1) a 1 b) Map.empty | |||
main :: Effect Unit | |||
main = do | |||
parentNode <- effParentNode | |||
aTags <- runReaderT getElements {parentNode: parentNode, targetElement: "a"} | |||
logTable $ bornBy1500 inventorList | |||
logShow $ fullNames inventorList | |||
logTable $ orderedByYear inventorList | |||
logShow $ totalYears inventorList | |||
logTable $ orderedByOldest inventorList | |||
nodeArray <- NodeList.toArray aTags | |||
txtContent <- traverse Node.textContent nodeArray | |||
logShow $ filter (StringUtils.includes "de") txtContent | |||
logShow $ alpha people | |||
logShow $ transportation ranData |
@@ -0,0 +1,92 @@ | |||
module ExerciseData | |||
( Inventor | |||
, inventorList | |||
, people | |||
, ranData | |||
) where | |||
type Inventor = | |||
{ first :: String | |||
, last :: String | |||
, year :: Int | |||
, passed :: Int | |||
} | |||
inventorList :: Array Inventor | |||
inventorList = [ | |||
{ first: "Albert", last: "Einstein", year: 1879, passed: 1955 }, | |||
{ first: "Isaac", last: "Newton", year: 1643, passed: 1727 }, | |||
{ first: "Galileo", last: "Galilei", year: 1564, passed: 1642 }, | |||
{ first: "Marie", last: "Curie", year: 1867, passed: 1934 }, | |||
{ first: "Johannes", last: "Kepler", year: 1571, passed: 1630 }, | |||
{ first: "Nicolaus", last: "Copernicus", year: 1473, passed: 1543 }, | |||
{ first: "Max", last: "Planck", year: 1858, passed: 1947 }, | |||
{ first: "Katherine", last: "Blodgett", year: 1898, passed: 1979 }, | |||
{ first: "Ada", last: "Lovelace", year: 1815, passed: 1852 }, | |||
{ first: "Sarah E.", last: "Goode", year: 1855, passed: 1905 }, | |||
{ first: "Lise", last: "Meitner", year: 1878, passed: 1968 }, | |||
{ first: "Hanna", last: "Hammarström", year: 1829, passed: 1909 } | |||
] | |||
people :: Array String | |||
people = | |||
["Beck, Glenn" | |||
, "Becker, Carl" | |||
, "Beckett, Samuel" | |||
, "Beddoes, Mick" | |||
, "Beecher, Henry" | |||
, "Beethoven, Ludwig" | |||
, "Begin, Menachem" | |||
, "Belloc, Hilaire" | |||
, "Bellow, Saul" | |||
, "Benchley, Robert" | |||
, "Benenson, Peter" | |||
, "Ben-Gurion, David" | |||
, "Benjamin, Walter" | |||
, "Benn, Tony" | |||
, "Bennington, Chester" | |||
, "Benson, Leana" | |||
, "Bent, Silas" | |||
, "Bentsen, Lloyd" | |||
, "Berger, Ric" | |||
, "Bergman, Ingmar" | |||
, "Berio, Luciano" | |||
, "Berle, Milton" | |||
, "Berlin, Irving" | |||
, "Berne, Eric" | |||
, "Bernhard, Sandra" | |||
, "Berra, Yogi" | |||
, "Berry, Halle" | |||
, "Berry, Wendell" | |||
, "Bethea, Erin" | |||
, "Bevan, Aneurin" | |||
, "Bevel, Ken" | |||
, "Biden, Joseph" | |||
, "Bierce, Ambrose" | |||
, "Biko, Steve" | |||
, "Billings, Josh" | |||
, "Biondo, Frank" | |||
, "Birrell, Augustine" | |||
, "Black, Elk" | |||
, "Blair, Robert" | |||
, "Blair, Tony" | |||
, "Blake, William" | |||
] | |||
ranData :: Array String | |||
ranData = | |||
[ "car" | |||
, "car" | |||
, "truck" | |||
, "truck" | |||
, "bike" | |||
, "walk" | |||
, "car" | |||
, "van" | |||
, "bike" | |||
, "walk" | |||
, "car" | |||
, "van" | |||
, "car" | |||
, "truck" | |||
] |
@@ -0,0 +1,131 @@ | |||
<!doctype html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="UTF-8" /> | |||
<title>Array Cardio Day 1</title> | |||
</head> | |||
<body> | |||
<div class="mw-category-generated" lang="en" dir="ltr"> | |||
<div id="mw-pages"> | |||
<div lang="en" dir="ltr" class="mw-content-ltr"> | |||
<div class="mw-category"> | |||
<div class="mw-category-group"> | |||
<h3> </h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevards_of_Paris" title="Boulevards of Paris">Boulevards of Paris</a></li> | |||
<li><a href="/wiki/City_walls_of_Paris" title="City walls of Paris">City walls of Paris</a></li> | |||
<li><a href="/wiki/Thiers_wall" title="Thiers wall">Thiers wall</a></li> | |||
<li><a href="/wiki/Wall_of_Charles_V" title="Wall of Charles V">Wall of Charles V</a></li> | |||
<li><a href="/wiki/Wall_of_Philip_II_Augustus" title="Wall of Philip II Augustus">Wall of Philip II Augustus</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>*</h3> | |||
<ul> | |||
<li><a href="/wiki/City_gates_of_Paris" title="City gates of Paris">City gates of Paris</a></li> | |||
<li><a href="/wiki/Haussmann%27s_renovation_of_Paris" title="Haussmann's renovation of Paris">Haussmann's renovation of Paris</a></li> | |||
<li><a href="/wiki/Boulevards_of_the_Marshals" title="Boulevards of the Marshals">Boulevards of the Marshals</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>A</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Auguste-Blanqui" title="Boulevard Auguste-Blanqui">Boulevard Auguste-Blanqui</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>B</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Barb%C3%A8s" title="Boulevard Barbès">Boulevard Barbès</a></li> | |||
<li><a href="/wiki/Boulevard_Beaumarchais" title="Boulevard Beaumarchais">Boulevard Beaumarchais</a></li> | |||
<li><a href="/wiki/Boulevard_de_l%27Amiral-Bruix" title="Boulevard de l'Amiral-Bruix">Boulevard de l'Amiral-Bruix</a></li> | |||
<li><a href="/wiki/Boulevard_Mortier" title="Boulevard Mortier">Boulevard Mortier</a></li> | |||
<li><a href="/wiki/Boulevard_Poniatowski" title="Boulevard Poniatowski">Boulevard Poniatowski</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>C</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_des_Capucines" title="Boulevard des Capucines">Boulevard des Capucines</a></li> | |||
<li><a href="/wiki/Boulevard_de_la_Chapelle" title="Boulevard de la Chapelle">Boulevard de la Chapelle</a></li> | |||
<li><a href="/wiki/Boulevard_de_Clichy" title="Boulevard de Clichy">Boulevard de Clichy</a></li> | |||
<li><a href="/wiki/Boulevard_du_Crime" title="Boulevard du Crime">Boulevard du Crime</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>G</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_du_G%C3%A9n%C3%A9ral-d%27Arm%C3%A9e-Jean-Simon" title="Boulevard du Général-d'Armée-Jean-Simon">Boulevard du Général-d'Armée-Jean-Simon</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>H</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Haussmann" title="Boulevard Haussmann">Boulevard Haussmann</a></li> | |||
<li><a href="/wiki/Boulevard_de_l%27H%C3%B4pital" title="Boulevard de l'Hôpital">Boulevard de l'Hôpital</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>I</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_des_Italiens" title="Boulevard des Italiens">Boulevard des Italiens</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>L</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Lefebvre" title="Boulevard Lefebvre">Boulevard Lefebvre</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>M</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_de_la_Madeleine" title="Boulevard de la Madeleine">Boulevard de la Madeleine</a></li> | |||
<li><a href="/wiki/Boulevard_de_Magenta" title="Boulevard de Magenta">Boulevard de Magenta</a></li> | |||
<li><a href="/wiki/Boulevard_Montmartre" title="Boulevard Montmartre">Boulevard Montmartre</a></li> | |||
<li><a href="/wiki/Boulevard_du_Montparnasse" title="Boulevard du Montparnasse">Boulevard du Montparnasse</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>R</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Raspail" title="Boulevard Raspail">Boulevard Raspail</a></li> | |||
<li><a href="/wiki/Boulevard_Richard-Lenoir" title="Boulevard Richard-Lenoir">Boulevard Richard-Lenoir</a></li> | |||
<li><a href="/wiki/Boulevard_de_Rochechouart" title="Boulevard de Rochechouart">Boulevard de Rochechouart</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>S</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Saint-Germain" title="Boulevard Saint-Germain">Boulevard Saint-Germain</a></li> | |||
<li><a href="/wiki/Boulevard_Saint-Michel" title="Boulevard Saint-Michel">Boulevard Saint-Michel</a></li> | |||
<li><a href="/wiki/Boulevard_de_S%C3%A9bastopol" title="Boulevard de Sébastopol">Boulevard de Sébastopol</a></li> | |||
<li><a href="/wiki/Boulevard_de_Strasbourg" title="Boulevard de Strasbourg">Boulevard de Strasbourg</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>T</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_du_Temple" title="Boulevard du Temple">Boulevard du Temple</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>V</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_Voltaire" title="Boulevard Voltaire">Boulevard Voltaire</a></li> | |||
</ul> | |||
</div> | |||
<div class="mw-category-group"> | |||
<h3>Z</h3> | |||
<ul> | |||
<li><a href="/wiki/Boulevard_de_la_Zone" title="Boulevard de la Zone">Boulevard de la Zone</a></li> | |||
</ul> | |||
</div> | |||
</div> | |||
</div> | |||
<script src="app.js" type="text/javascript"></script> | |||
</body> | |||
</html> |
@@ -2,8 +2,8 @@ module Main where | |||
import Prelude | |||
import Effect (Effect) | |||
import Effect.Console (log) | |||
import Effect.Console (logShow) | |||
main :: Effect Unit | |||
main = do | |||
log "Hello sailor!" | |||
logShow "" |