From a5820ba4ab2979a8a97b342d359e2bbb078696af Mon Sep 17 00:00:00 2001 From: tofische Date: Sun, 21 Dec 2025 18:59:42 +0100 Subject: [PATCH 01/19] Add Grep exercise --- .../grep/.docs/instructions.append.md | 3 + exercises/practice/grep/.docs/instructions.md | 27 ++ exercises/practice/grep/.meta/config.json | 23 ++ .../examples/success-standard/package.yaml | 17 + .../examples/success-standard/src/Grep.hs | 38 +++ exercises/practice/grep/.meta/tests.toml | 85 +++++ exercises/practice/grep/package.yaml | 19 ++ exercises/practice/grep/src/Grep.hs | 8 + exercises/practice/grep/stack.yaml | 1 + exercises/practice/grep/test/Tests.hs | 295 ++++++++++++++++++ 10 files changed, 516 insertions(+) create mode 100644 exercises/practice/grep/.docs/instructions.append.md create mode 100644 exercises/practice/grep/.docs/instructions.md create mode 100644 exercises/practice/grep/.meta/config.json create mode 100644 exercises/practice/grep/.meta/examples/success-standard/package.yaml create mode 100644 exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs create mode 100644 exercises/practice/grep/.meta/tests.toml create mode 100644 exercises/practice/grep/package.yaml create mode 100644 exercises/practice/grep/src/Grep.hs create mode 100644 exercises/practice/grep/stack.yaml create mode 100644 exercises/practice/grep/test/Tests.hs diff --git a/exercises/practice/grep/.docs/instructions.append.md b/exercises/practice/grep/.docs/instructions.append.md new file mode 100644 index 000000000..0b90e1a00 --- /dev/null +++ b/exercises/practice/grep/.docs/instructions.append.md @@ -0,0 +1,3 @@ +# Instructions append + +To simplify the exercise the flags are already parsed. diff --git a/exercises/practice/grep/.docs/instructions.md b/exercises/practice/grep/.docs/instructions.md new file mode 100644 index 000000000..004f28acd --- /dev/null +++ b/exercises/practice/grep/.docs/instructions.md @@ -0,0 +1,27 @@ +# Instructions + +Search files for lines matching a search string and return all matching lines. + +The Unix [`grep`][grep] command searches files for lines that match a regular expression. +Your task is to implement a simplified `grep` command, which supports searching for fixed strings. + +The `grep` command takes three arguments: + +1. The string to search for. +2. Zero or more flags for customizing the command's behavior. +3. One or more files to search in. + +It then reads the contents of the specified files (in the order specified), finds the lines that contain the search string, and finally returns those lines in the order in which they were found. +When searching in multiple files, each matching line is prepended by the file name and a colon (':'). + +## Flags + +The `grep` command supports the following flags: + +- `-n` Prepend the line number and a colon (':') to each line in the output, placing the number after the filename (if present). +- `-l` Output only the names of the files that contain at least one matching line. +- `-i` Match using a case-insensitive comparison. +- `-v` Invert the program -- collect all lines that fail to match. +- `-x` Search only for lines where the search string matches the entire line. + +[grep]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html diff --git a/exercises/practice/grep/.meta/config.json b/exercises/practice/grep/.meta/config.json new file mode 100644 index 000000000..42d124be1 --- /dev/null +++ b/exercises/practice/grep/.meta/config.json @@ -0,0 +1,23 @@ +{ + "authors": [ + "tofische" + ], + "files": { + "solution": [ + "src/Grep.hs", + "package.yaml" + ], + "test": [ + "test/Tests.hs" + ], + "example": [ + ".meta/examples/success-standard/src/Grep.hs" + ], + "invalidator": [ + "stack.yaml" + ] + }, + "blurb": "Search a file for lines matching a regular expression pattern. Return the line number and contents of each matching line.", + "source": "Conversation with Nate Foster.", + "source_url": "https://www.cs.cornell.edu/Courses/cs3110/2014sp/hw/0/ps0.pdf" +} diff --git a/exercises/practice/grep/.meta/examples/success-standard/package.yaml b/exercises/practice/grep/.meta/examples/success-standard/package.yaml new file mode 100644 index 000000000..606dd09ef --- /dev/null +++ b/exercises/practice/grep/.meta/examples/success-standard/package.yaml @@ -0,0 +1,17 @@ +name: grep + +dependencies: + - base + +library: + exposed-modules: Grep + source-dirs: src + +tests: + test: + main: Tests.hs + source-dirs: test + dependencies: + - grep + - hspec + - directory diff --git a/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs b/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs new file mode 100644 index 000000000..1cc0214d8 --- /dev/null +++ b/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs @@ -0,0 +1,38 @@ +module Grep (grep, Flag(..)) where + +import Data.Char (toLower) +import Data.List (isInfixOf) +import System.IO (readFile') + +data Flag = N | L | I | V | X deriving (Eq, Ord) + +type Flags = [Flag] + +grep :: String -> Flags -> [FilePath] -> IO [String] +grep pattern flags files = do + content <- mapM readFile' files + let input = zip files (map lines content) + return $ grep' pattern flags input + +grep' :: String -> Flags -> [(String, [String])] -> [String] +grep' pattern flags files = concatMap grepInFile files + where + flagN = N `elem` flags + flagL = L `elem` flags + flagI = I `elem` flags + flagV = V `elem` flags + flagX = X `elem` flags + pattern' = if flagI then map toLower pattern else pattern + multiple = length files > 1 + grepInFile (fileName, content) = if flagL && not (null matchInFile) then [fileName] else matchInFile + where + matchInFile = concatMap grepInLine $ zip content [1..] + grepInLine :: (String, Int) -> [String] + grepInLine (line, lineNum) = [res | if flagV then not isMatchInLine else isMatchInLine] + where + line' = if flagI then map toLower line else line + isMatchInLine = if flagX then pattern' == line' else pattern' `isInfixOf` line' + res = + (if multiple then fileName <> ":" else "") <> + (if flagN then show lineNum <> ":" else "") <> + line diff --git a/exercises/practice/grep/.meta/tests.toml b/exercises/practice/grep/.meta/tests.toml new file mode 100644 index 000000000..04c51e71b --- /dev/null +++ b/exercises/practice/grep/.meta/tests.toml @@ -0,0 +1,85 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[9049fdfd-53a7-4480-a390-375203837d09] +description = "Test grepping a single file -> One file, one match, no flags" + +[76519cce-98e3-46cd-b287-aac31b1d77d6] +description = "Test grepping a single file -> One file, one match, print line numbers flag" + +[af0b6d3c-e0e8-475e-a112-c0fc10a1eb30] +description = "Test grepping a single file -> One file, one match, case-insensitive flag" + +[ff7af839-d1b8-4856-a53e-99283579b672] +description = "Test grepping a single file -> One file, one match, print file names flag" + +[8625238a-720c-4a16-81f2-924ec8e222cb] +description = "Test grepping a single file -> One file, one match, match entire lines flag" + +[2a6266b3-a60f-475c-a5f5-f5008a717d3e] +description = "Test grepping a single file -> One file, one match, multiple flags" + +[842222da-32e8-4646-89df-0d38220f77a1] +description = "Test grepping a single file -> One file, several matches, no flags" + +[4d84f45f-a1d8-4c2e-a00e-0b292233828c] +description = "Test grepping a single file -> One file, several matches, print line numbers flag" + +[0a483b66-315b-45f5-bc85-3ce353a22539] +description = "Test grepping a single file -> One file, several matches, match entire lines flag" + +[3d2ca86a-edd7-494c-8938-8eeed1c61cfa] +description = "Test grepping a single file -> One file, several matches, case-insensitive flag" + +[1f52001f-f224-4521-9456-11120cad4432] +description = "Test grepping a single file -> One file, several matches, inverted flag" + +[7a6ede7f-7dd5-4364-8bf8-0697c53a09fe] +description = "Test grepping a single file -> One file, no matches, various flags" + +[3d3dfc23-8f2a-4e34-abd6-7b7d140291dc] +description = "Test grepping a single file -> One file, one match, file flag takes precedence over line flag" + +[87b21b24-b788-4d6e-a68b-7afe9ca141fe] +description = "Test grepping a single file -> One file, several matches, inverted and match entire lines flags" + +[ba496a23-6149-41c6-a027-28064ed533e5] +description = "Test grepping multiples files at once -> Multiple files, one match, no flags" + +[4539bd36-6daa-4bc3-8e45-051f69f5aa95] +description = "Test grepping multiples files at once -> Multiple files, several matches, no flags" + +[9fb4cc67-78e2-4761-8e6b-a4b57aba1938] +description = "Test grepping multiples files at once -> Multiple files, several matches, print line numbers flag" + +[aeee1ef3-93c7-4cd5-af10-876f8c9ccc73] +description = "Test grepping multiples files at once -> Multiple files, one match, print file names flag" + +[d69f3606-7d15-4ddf-89ae-01df198e6b6c] +description = "Test grepping multiples files at once -> Multiple files, several matches, case-insensitive flag" + +[82ef739d-6701-4086-b911-007d1a3deb21] +description = "Test grepping multiples files at once -> Multiple files, several matches, inverted flag" + +[77b2eb07-2921-4ea0-8971-7636b44f5d29] +description = "Test grepping multiples files at once -> Multiple files, one match, match entire lines flag" + +[e53a2842-55bb-4078-9bb5-04ac38929989] +description = "Test grepping multiples files at once -> Multiple files, one match, multiple flags" + +[9c4f7f9a-a555-4e32-bb06-4b8f8869b2cb] +description = "Test grepping multiples files at once -> Multiple files, no matches, various flags" + +[ba5a540d-bffd-481b-bd0c-d9a30f225e01] +description = "Test grepping multiples files at once -> Multiple files, several matches, file flag takes precedence over line number flag" + +[ff406330-2f0b-4b17-9ee4-4b71c31dd6d2] +description = "Test grepping multiples files at once -> Multiple files, several matches, inverted and match entire lines flags" diff --git a/exercises/practice/grep/package.yaml b/exercises/practice/grep/package.yaml new file mode 100644 index 000000000..3a33129ae --- /dev/null +++ b/exercises/practice/grep/package.yaml @@ -0,0 +1,19 @@ +name: grep +version: 1.0.0.0 + +dependencies: + - base + +library: + exposed-modules: Grep + source-dirs: src + ghc-options: -Wall + +tests: + test: + main: Tests.hs + source-dirs: test + dependencies: + - grep + - hspec + - directory diff --git a/exercises/practice/grep/src/Grep.hs b/exercises/practice/grep/src/Grep.hs new file mode 100644 index 000000000..a2cf7dda3 --- /dev/null +++ b/exercises/practice/grep/src/Grep.hs @@ -0,0 +1,8 @@ +module Grep (grep, Flag(..)) where + +data Flag = N | L | I | V | X deriving (Eq, Ord) + +type Flags = [Flag] + +grep :: String -> Flags -> [FilePath] -> IO [String] +grep pattern flags files = error "You need to implement this function." diff --git a/exercises/practice/grep/stack.yaml b/exercises/practice/grep/stack.yaml new file mode 100644 index 000000000..115878212 --- /dev/null +++ b/exercises/practice/grep/stack.yaml @@ -0,0 +1 @@ +resolver: lts-20.18 diff --git a/exercises/practice/grep/test/Tests.hs b/exercises/practice/grep/test/Tests.hs new file mode 100644 index 000000000..d5f93b3d1 --- /dev/null +++ b/exercises/practice/grep/test/Tests.hs @@ -0,0 +1,295 @@ +{-# LANGUAGE RecordWildCards #-} + +import Data.Foldable (for_) +import Test.Hspec (Spec, describe, it, shouldBe, around) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) +import System.Directory (getTemporaryDirectory, removeFile, setCurrentDirectory) + +import Grep (grep, Flag(..)) + +main :: IO () +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = describe "grep" $ for_ cases test + +test testCase@Case{..} = + around (withFiles files) $ + it description $ + \files -> grep pattern flags files >>= (\content -> content `shouldBe` expected) + +withFiles files runTest = do + sys <- getTemporaryDirectory + setCurrentDirectory sys + for_ files $ \file -> writeFile (fst file) (unlines $ snd file) + runTest $ map fst files + for_ files $ \file -> removeFile (fst file) + +data Case = Case { description :: String + , pattern :: String + , flags :: [Flag] + , files :: [(String, [String])] + , expected :: [String] + } + +cases :: [Case] +cases = + [ Case { description = "One file, one match, no flags" + , pattern = "Agamemnon" + , flags = [] + , files = [iliad] + , expected = ["Of Atreus, Agamemnon, King of men."] + } + , Case { description = "One file, one match, print line numbers flag" + , pattern = "Forbidden" + , flags = [N] + , files = [paradiseLost] + , expected = ["2:Of that Forbidden Tree, whose mortal tast"] + } + , Case { description = "One file, one match, case-insensitive flag" + , pattern = "FORBIDDEN" + , flags = [I] + , files = [paradiseLost] + , expected = ["Of that Forbidden Tree, whose mortal tast"] + } + , Case { description = "One file, one match, print file names flag" + , pattern = "Forbidden" + , flags = [L] + , files = [paradiseLost] + , expected = ["paradise-lost.txt"] + } + , Case { description = "One file, one match, match entire lines flag" + , pattern = "With loss of Eden, till one greater Man" + , flags = [X] + , files = [paradiseLost] + , expected = ["With loss of Eden, till one greater Man"] + } + , Case { description = "One file, one match, multiple flags" + , pattern = "OF ATREUS, Agamemnon, KIng of MEN." + , flags = [N, I, X] + , files = [iliad] + , expected = ["9:Of Atreus, Agamemnon, King of men."] + } + , Case { description = "One file, several matches, no flags" + , pattern = "may" + , flags = [] + , files = [midsummerNight] + , expected = [ + "Nor how it may concern my modesty,", + "But I beseech your grace that I may know", + "The worst that may befall me in this case," + ] + } + , Case { description = "One file, several matches, print line numbers flag" + , pattern = "may" + , flags = [N] + , files = [midsummerNight] + , expected = [ + "3:Nor how it may concern my modesty,", + "5:But I beseech your grace that I may know", + "6:The worst that may befall me in this case," + ] + } + , Case { description = "One file, several matches, match entire lines flag" + , pattern = "may" + , flags = [X] + , files = [midsummerNight] + , expected = [] + } + , Case { description = "One file, several matches, case-insensitive flag" + , pattern = "ACHILLES" + , flags = [I] + , files = [iliad] + , expected = [ + "Achilles sing, O Goddess! Peleus' son;", + "The noble Chief Achilles from the son" + ] + } + , Case { description = "One file, several matches, inverted flag" + , pattern = "Of" + , flags = [V] + , files = [paradiseLost] + , expected = [ + "Brought Death into the World, and all our woe,", + "With loss of Eden, till one greater Man", + "Restore us, and regain the blissful Seat,", + "Sing Heav'nly Muse, that on the secret top", + "That Shepherd, who first taught the chosen Seed" + ] + } + , Case { description = "One file, no matches, various flags" + , pattern = "Gandalf" + , flags = [N, L, X, I] + , files = [iliad] + , expected = [] + } + , Case { description = "One file, one match, file flag takes precedence over line flag" + , pattern = "ten" + , flags = [N, L] + , files = [iliad] + , expected = ["iliad.txt"] + } + , Case { description = "One file, several matches, inverted and match entire lines flags" + , pattern = "Illustrious into Ades premature," + , flags = [X, V] + , files = [iliad] + , expected = [ + "Achilles sing, O Goddess! Peleus' son;", + "His wrath pernicious, who ten thousand woes", + "Caused to Achaia's host, sent many a soul", + "And Heroes gave (so stood the will of Jove)", + "To dogs and to all ravening fowls a prey,", + "When fierce dispute had separated once", + "The noble Chief Achilles from the son", + "Of Atreus, Agamemnon, King of men." + ] + } + , Case { description = "Multiple files, one match, no flags" + , pattern = "Agamemnon" + , flags = [] + , files = [iliad, midsummerNight, paradiseLost] + , expected = ["iliad.txt:Of Atreus, Agamemnon, King of men."] + } + , Case { description = "Multiple files, several matches, no flags" + , pattern = "may" + , flags = [] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [ + "midsummer-night.txt:Nor how it may concern my modesty,", + "midsummer-night.txt:But I beseech your grace that I may know", + "midsummer-night.txt:The worst that may befall me in this case," + ] + } + , Case { description = "Multiple files, several matches, print line numbers flag" + , pattern = "that" + , flags = [N] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [ + "midsummer-night.txt:5:But I beseech your grace that I may know", + "midsummer-night.txt:6:The worst that may befall me in this case,", + "paradise-lost.txt:2:Of that Forbidden Tree, whose mortal tast", + "paradise-lost.txt:6:Sing Heav'nly Muse, that on the secret top" + ] + } + , Case { description = "Multiple files, one match, print file names flag" + , pattern = "who" + , flags = [L] + , files = [iliad, midsummerNight, paradiseLost] + , expected = ["iliad.txt", "paradise-lost.txt"] + } + , Case { description = "Multiple files, several matches, case-insensitive flag" + , pattern = "TO" + , flags = [I] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [ + "iliad.txt:Caused to Achaia's host, sent many a soul", + "iliad.txt:Illustrious into Ades premature,", + "iliad.txt:And Heroes gave (so stood the will of Jove)", + "iliad.txt:To dogs and to all ravening fowls a prey,", + "midsummer-night.txt:I do entreat your grace to pardon me.", + "midsummer-night.txt:In such a presence here to plead my thoughts;", + "midsummer-night.txt:If I refuse to wed Demetrius.", + "paradise-lost.txt:Brought Death into the World, and all our woe,", + "paradise-lost.txt:Restore us, and regain the blissful Seat,", + "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top" + ] + } + , Case { description = "Multiple files, several matches, inverted flag" + , pattern = "a" + , flags = [V] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [ + "iliad.txt:Achilles sing, O Goddess! Peleus' son;", + "iliad.txt:The noble Chief Achilles from the son", + "midsummer-night.txt:If I refuse to wed Demetrius." + ] + } + , Case { description = "Multiple files, one match, match entire lines flag" + , pattern = "But I beseech your grace that I may know" + , flags = [X] + , files = [iliad, midsummerNight, paradiseLost] + , expected = ["midsummer-night.txt:But I beseech your grace that I may know"] + } + , Case { description = "Multiple files, one match, multiple flags" + , pattern = "WITH LOSS OF EDEN, TILL ONE GREATER MAN" + , flags = [N, I, X] + , files = [iliad, midsummerNight, paradiseLost] + , expected = ["paradise-lost.txt:4:With loss of Eden, till one greater Man"] + } + , Case { description = "Multiple files, no matches, various flags" + , pattern = "Frodo" + , flags = [N, L, X, I] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [] + } + , Case { description = "Multiple files, several matches, file flag takes precedence over line number flag" + , pattern = "who" + , flags = [N, L] + , files = [iliad, midsummerNight, paradiseLost] + , expected = ["iliad.txt", "paradise-lost.txt"] + } + , Case { description = "Multiple files, several matches, inverted and match entire lines flags" + , pattern = "Illustrious into Ades premature," + , flags = [X, V] + , files = [iliad, midsummerNight, paradiseLost] + , expected = [ + "iliad.txt:Achilles sing, O Goddess! Peleus' son;", + "iliad.txt:His wrath pernicious, who ten thousand woes", + "iliad.txt:Caused to Achaia's host, sent many a soul", + "iliad.txt:And Heroes gave (so stood the will of Jove)", + "iliad.txt:To dogs and to all ravening fowls a prey,", + "iliad.txt:When fierce dispute had separated once", + "iliad.txt:The noble Chief Achilles from the son", + "iliad.txt:Of Atreus, Agamemnon, King of men.", + "midsummer-night.txt:I do entreat your grace to pardon me.", + "midsummer-night.txt:I know not by what power I am made bold,", + "midsummer-night.txt:Nor how it may concern my modesty,", + "midsummer-night.txt:In such a presence here to plead my thoughts;", + "midsummer-night.txt:But I beseech your grace that I may know", + "midsummer-night.txt:The worst that may befall me in this case,", + "midsummer-night.txt:If I refuse to wed Demetrius.", + "paradise-lost.txt:Of Mans First Disobedience, and the Fruit", + "paradise-lost.txt:Of that Forbidden Tree, whose mortal tast", + "paradise-lost.txt:Brought Death into the World, and all our woe,", + "paradise-lost.txt:With loss of Eden, till one greater Man", + "paradise-lost.txt:Restore us, and regain the blissful Seat,", + "paradise-lost.txt:Sing Heav'nly Muse, that on the secret top", + "paradise-lost.txt:Of Oreb, or of Sinai, didst inspire", + "paradise-lost.txt:That Shepherd, who first taught the chosen Seed" + ] + } + ] + +iliad = + ("iliad.txt", [ + "Achilles sing, O Goddess! Peleus' son;", + "His wrath pernicious, who ten thousand woes", + "Caused to Achaia's host, sent many a soul", + "Illustrious into Ades premature,", + "And Heroes gave (so stood the will of Jove)", + "To dogs and to all ravening fowls a prey,", + "When fierce dispute had separated once", + "The noble Chief Achilles from the son", + "Of Atreus, Agamemnon, King of men." + ]) +midsummerNight = + ("midsummer-night.txt", [ + "I do entreat your grace to pardon me.", + "I know not by what power I am made bold,", + "Nor how it may concern my modesty,", + "In such a presence here to plead my thoughts;", + "But I beseech your grace that I may know", + "The worst that may befall me in this case,", + "If I refuse to wed Demetrius." + ]) +paradiseLost = + ("paradise-lost.txt", [ + "Of Mans First Disobedience, and the Fruit", + "Of that Forbidden Tree, whose mortal tast", + "Brought Death into the World, and all our woe,", + "With loss of Eden, till one greater Man", + "Restore us, and regain the blissful Seat,", + "Sing Heav'nly Muse, that on the secret top", + "Of Oreb, or of Sinai, didst inspire", + "That Shepherd, who first taught the chosen Seed" + ]) \ No newline at end of file From 512a17c9e595032b348d8c43000dbb4254a9afca Mon Sep 17 00:00:00 2001 From: tofische Date: Wed, 13 May 2026 21:42:12 +0200 Subject: [PATCH 02/19] Updated config.json to reference proper package.yaml --- exercises/concept/guessing-game/.meta/config.json | 5 +++-- exercises/concept/lucians-luscious-lasagna/.meta/config.json | 5 +++-- exercises/concept/pacman-rules/.meta/config.json | 5 +++-- exercises/concept/temperature/.meta/config.json | 5 +++-- exercises/concept/valentines-day/.meta/config.json | 5 +++-- exercises/practice/accumulate/.meta/config.json | 3 ++- exercises/practice/acronym/.meta/config.json | 3 ++- exercises/practice/affine-cipher/.meta/config.json | 2 +- exercises/practice/all-your-base/.meta/config.json | 3 ++- exercises/practice/allergies/.meta/config.json | 3 ++- exercises/practice/alphametics/.meta/config.json | 3 ++- exercises/practice/anagram/.meta/config.json | 3 ++- exercises/practice/armstrong-numbers/.meta/config.json | 3 ++- exercises/practice/atbash-cipher/.meta/config.json | 3 ++- exercises/practice/bank-account/.meta/config.json | 3 ++- exercises/practice/beer-song/.meta/config.json | 3 ++- exercises/practice/binary-search-tree/.meta/config.json | 3 ++- exercises/practice/binary-search/.meta/config.json | 3 ++- exercises/practice/binary/.meta/config.json | 5 +++-- exercises/practice/bob/.meta/config.json | 3 ++- exercises/practice/book-store/.meta/config.json | 3 ++- exercises/practice/bowling/.meta/config.json | 3 ++- exercises/practice/change/.meta/config.json | 3 ++- exercises/practice/clock/.meta/config.json | 3 ++- exercises/practice/collatz-conjecture/.meta/config.json | 3 ++- exercises/practice/complex-numbers/.meta/config.json | 3 ++- exercises/practice/connect/.meta/config.json | 3 ++- exercises/practice/crypto-square/.meta/config.json | 3 ++- exercises/practice/custom-set/.meta/config.json | 3 ++- exercises/practice/darts/.meta/config.json | 3 ++- exercises/practice/diamond/.meta/config.json | 3 ++- exercises/practice/difference-of-squares/.meta/config.json | 3 ++- exercises/practice/dnd-character/.meta/config.json | 3 ++- exercises/practice/dominoes/.meta/config.json | 3 ++- exercises/practice/etl/.meta/config.json | 3 ++- exercises/practice/food-chain/.meta/config.json | 3 ++- exercises/practice/forth/.meta/config.json | 3 ++- exercises/practice/game-of-life/.meta/config.json | 3 ++- exercises/practice/gigasecond/.meta/config.json | 3 ++- exercises/practice/go-counting/.meta/config.json | 3 ++- exercises/practice/grade-school/.meta/config.json | 3 ++- exercises/practice/grains/.meta/config.json | 3 ++- exercises/practice/hamming/.meta/config.json | 3 ++- exercises/practice/hello-world/.meta/config.json | 3 ++- exercises/practice/hexadecimal/.meta/config.json | 3 ++- exercises/practice/house/.meta/config.json | 3 ++- exercises/practice/isbn-verifier/.meta/config.json | 3 ++- exercises/practice/isogram/.meta/config.json | 3 ++- exercises/practice/kindergarten-garden/.meta/config.json | 3 ++- exercises/practice/knapsack/.meta/config.json | 3 ++- exercises/practice/largest-series-product/.meta/config.json | 3 ++- exercises/practice/leap/.meta/config.json | 3 ++- exercises/practice/lens-person/.meta/config.json | 3 ++- exercises/practice/linked-list/.meta/config.json | 3 ++- exercises/practice/list-ops/.meta/config.json | 3 ++- exercises/practice/luhn/.meta/config.json | 3 ++- exercises/practice/matching-brackets/.meta/config.json | 3 ++- exercises/practice/matrix/.meta/config.json | 3 ++- exercises/practice/meetup/.meta/config.json | 3 ++- exercises/practice/minesweeper/.meta/config.json | 3 ++- exercises/practice/nth-prime/.meta/config.json | 3 ++- exercises/practice/nucleotide-count/.meta/config.json | 3 ++- exercises/practice/ocr-numbers/.meta/config.json | 3 ++- exercises/practice/octal/.meta/config.json | 3 ++- exercises/practice/palindrome-products/.meta/config.json | 3 ++- exercises/practice/pangram/.meta/config.json | 3 ++- .../practice/parallel-letter-frequency/.meta/config.json | 3 ++- exercises/practice/pascals-triangle/.meta/config.json | 3 ++- exercises/practice/perfect-numbers/.meta/config.json | 3 ++- exercises/practice/phone-number/.meta/config.json | 3 ++- exercises/practice/pig-latin/.meta/config.json | 3 ++- exercises/practice/poker/.meta/config.json | 3 ++- exercises/practice/pov/.meta/config.json | 3 ++- exercises/practice/prime-factors/.meta/config.json | 3 ++- exercises/practice/protein-translation/.meta/config.json | 3 ++- exercises/practice/proverb/.meta/config.json | 3 ++- exercises/practice/pythagorean-triplet/.meta/config.json | 3 ++- exercises/practice/queen-attack/.meta/config.json | 3 ++- exercises/practice/rail-fence-cipher/.meta/config.json | 3 ++- exercises/practice/raindrops/.meta/config.json | 3 ++- exercises/practice/rational-numbers/.meta/config.json | 3 ++- exercises/practice/resistor-color-duo/.meta/config.json | 3 ++- exercises/practice/resistor-color-trio/.meta/config.json | 3 ++- exercises/practice/reverse-string/.meta/config.json | 3 ++- exercises/practice/rna-transcription/.meta/config.json | 3 ++- exercises/practice/robot-name/.meta/config.json | 3 ++- exercises/practice/robot-simulator/.meta/config.json | 3 ++- exercises/practice/roman-numerals/.meta/config.json | 3 ++- exercises/practice/rotational-cipher/.meta/config.json | 3 ++- exercises/practice/run-length-encoding/.meta/config.json | 3 ++- exercises/practice/saddle-points/.meta/config.json | 3 ++- exercises/practice/satellite/.meta/config.json | 3 ++- exercises/practice/say/.meta/config.json | 3 ++- exercises/practice/scrabble-score/.meta/config.json | 3 ++- exercises/practice/secret-handshake/.meta/config.json | 3 ++- exercises/practice/series/.meta/config.json | 3 ++- exercises/practice/sgf-parsing/.meta/config.json | 3 ++- exercises/practice/sieve/.meta/config.json | 3 ++- exercises/practice/simple-cipher/.meta/config.json | 3 ++- exercises/practice/simple-linked-list/.meta/config.json | 3 ++- exercises/practice/space-age/.meta/config.json | 3 ++- exercises/practice/spiral-matrix/.meta/config.json | 3 ++- exercises/practice/state-of-tic-tac-toe/.meta/config.json | 3 ++- exercises/practice/strain/.meta/config.json | 3 ++- exercises/practice/sublist/.meta/config.json | 3 ++- exercises/practice/sum-of-multiples/.meta/config.json | 3 ++- exercises/practice/transpose/.meta/config.json | 3 ++- exercises/practice/triangle/.meta/config.json | 3 ++- exercises/practice/trinary/.meta/config.json | 3 ++- exercises/practice/twelve-days/.meta/config.json | 3 ++- exercises/practice/two-bucket/.meta/config.json | 3 ++- exercises/practice/word-count/.meta/config.json | 3 ++- exercises/practice/word-search/.meta/config.json | 3 ++- exercises/practice/wordy/.meta/config.json | 3 ++- exercises/practice/yacht/.meta/config.json | 3 ++- exercises/practice/zebra-puzzle/.meta/config.json | 3 ++- exercises/practice/zipper/.meta/config.json | 3 ++- 117 files changed, 239 insertions(+), 123 deletions(-) diff --git a/exercises/concept/guessing-game/.meta/config.json b/exercises/concept/guessing-game/.meta/config.json index fa491fb46..3a054f081 100644 --- a/exercises/concept/guessing-game/.meta/config.json +++ b/exercises/concept/guessing-game/.meta/config.json @@ -10,8 +10,9 @@ "test": [ "test/Tests.hs" ], - "exemplar": [ - ".meta/exemplar/src/GuessingGame.hs" + "example": [ + ".meta/exemplar/src/GuessingGame.hs", + ".meta/exemplar/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/concept/lucians-luscious-lasagna/.meta/config.json b/exercises/concept/lucians-luscious-lasagna/.meta/config.json index 34fcfe6f5..1bb04063f 100644 --- a/exercises/concept/lucians-luscious-lasagna/.meta/config.json +++ b/exercises/concept/lucians-luscious-lasagna/.meta/config.json @@ -10,8 +10,9 @@ "test": [ "test/Tests.hs" ], - "exemplar": [ - ".meta/exemplar/src/LuciansLusciousLasagna.hs" + "example": [ + ".meta/exemplar/src/LuciansLusciousLasagna.hs", + ".meta/exemplar/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/concept/pacman-rules/.meta/config.json b/exercises/concept/pacman-rules/.meta/config.json index 0ed04122e..f62cf9fef 100644 --- a/exercises/concept/pacman-rules/.meta/config.json +++ b/exercises/concept/pacman-rules/.meta/config.json @@ -10,8 +10,9 @@ "test": [ "test/Tests.hs" ], - "exemplar": [ - ".meta/exemplar/src/PacmanRules.hs" + "example": [ + ".meta/exemplar/src/PacmanRules.hs", + ".meta/exemplar/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/concept/temperature/.meta/config.json b/exercises/concept/temperature/.meta/config.json index 09c431604..5827b6318 100644 --- a/exercises/concept/temperature/.meta/config.json +++ b/exercises/concept/temperature/.meta/config.json @@ -10,8 +10,9 @@ "test": [ "test/Tests.hs" ], - "exemplar": [ - ".meta/exemplar/src/Temperature.hs" + "example": [ + ".meta/exemplar/src/Temperature.hs", + ".meta/exemplar/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/concept/valentines-day/.meta/config.json b/exercises/concept/valentines-day/.meta/config.json index 85d127d79..12e817eae 100644 --- a/exercises/concept/valentines-day/.meta/config.json +++ b/exercises/concept/valentines-day/.meta/config.json @@ -10,8 +10,9 @@ "test": [ "test/Tests.hs" ], - "exemplar": [ - ".meta/exemplar/src/ValentinesDay.hs" + "example": [ + ".meta/exemplar/src/ValentinesDay.hs", + ".meta/exemplar/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/accumulate/.meta/config.json b/exercises/practice/accumulate/.meta/config.json index 483566ac3..2f4ebea72 100644 --- a/exercises/practice/accumulate/.meta/config.json +++ b/exercises/practice/accumulate/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Accumulate.hs" + ".meta/examples/success-standard/src/Accumulate.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/acronym/.meta/config.json b/exercises/practice/acronym/.meta/config.json index ad9a41f68..b1be5991e 100644 --- a/exercises/practice/acronym/.meta/config.json +++ b/exercises/practice/acronym/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Acronym.hs" + ".meta/examples/success-standard/src/Acronym.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/affine-cipher/.meta/config.json b/exercises/practice/affine-cipher/.meta/config.json index bcc22a631..06680dfb5 100644 --- a/exercises/practice/affine-cipher/.meta/config.json +++ b/exercises/practice/affine-cipher/.meta/config.json @@ -12,7 +12,7 @@ ], "example": [ ".meta/examples/success-standard/src/Affine.hs", - ".meta/examples/success-text/src/Affine.hs" + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/all-your-base/.meta/config.json b/exercises/practice/all-your-base/.meta/config.json index a4e2b6d2a..4a1b86d8b 100644 --- a/exercises/practice/all-your-base/.meta/config.json +++ b/exercises/practice/all-your-base/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Base.hs" + ".meta/examples/success-standard/src/Base.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/allergies/.meta/config.json b/exercises/practice/allergies/.meta/config.json index aa5774f7e..436ff3553 100644 --- a/exercises/practice/allergies/.meta/config.json +++ b/exercises/practice/allergies/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Allergies.hs" + ".meta/examples/success-standard/src/Allergies.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/alphametics/.meta/config.json b/exercises/practice/alphametics/.meta/config.json index 1652a71b6..35c824c30 100644 --- a/exercises/practice/alphametics/.meta/config.json +++ b/exercises/practice/alphametics/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Alphametics.hs" + ".meta/examples/success-standard/src/Alphametics.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/anagram/.meta/config.json b/exercises/practice/anagram/.meta/config.json index c6c83309b..5beee6321 100644 --- a/exercises/practice/anagram/.meta/config.json +++ b/exercises/practice/anagram/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-settext/src/Anagram.hs" + ".meta/examples/success-settext/src/Anagram.hs", + ".meta/examples/success-settext/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/armstrong-numbers/.meta/config.json b/exercises/practice/armstrong-numbers/.meta/config.json index f60357f73..3d87ea81c 100644 --- a/exercises/practice/armstrong-numbers/.meta/config.json +++ b/exercises/practice/armstrong-numbers/.meta/config.json @@ -16,7 +16,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ArmstrongNumbers.hs" + ".meta/examples/success-standard/src/ArmstrongNumbers.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/atbash-cipher/.meta/config.json b/exercises/practice/atbash-cipher/.meta/config.json index 972ae8560..483d514c1 100644 --- a/exercises/practice/atbash-cipher/.meta/config.json +++ b/exercises/practice/atbash-cipher/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Atbash.hs" + ".meta/examples/success-standard/src/Atbash.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/bank-account/.meta/config.json b/exercises/practice/bank-account/.meta/config.json index bb6f99f4a..6e982e508 100644 --- a/exercises/practice/bank-account/.meta/config.json +++ b/exercises/practice/bank-account/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/BankAccount.hs" + ".meta/examples/success-standard/src/BankAccount.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/beer-song/.meta/config.json b/exercises/practice/beer-song/.meta/config.json index 8df5102fe..68e9f0a5c 100644 --- a/exercises/practice/beer-song/.meta/config.json +++ b/exercises/practice/beer-song/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Beer.hs" + ".meta/examples/success-standard/src/Beer.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/binary-search-tree/.meta/config.json b/exercises/practice/binary-search-tree/.meta/config.json index eba022725..7d3b671e3 100644 --- a/exercises/practice/binary-search-tree/.meta/config.json +++ b/exercises/practice/binary-search-tree/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/BST.hs" + ".meta/examples/success-standard/src/BST.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/binary-search/.meta/config.json b/exercises/practice/binary-search/.meta/config.json index 0236b497b..f8233158f 100644 --- a/exercises/practice/binary-search/.meta/config.json +++ b/exercises/practice/binary-search/.meta/config.json @@ -17,7 +17,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/BinarySearch.hs" + ".meta/examples/success-standard/src/BinarySearch.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/binary/.meta/config.json b/exercises/practice/binary/.meta/config.json index b81657d7f..7a21fd5e2 100644 --- a/exercises/practice/binary/.meta/config.json +++ b/exercises/practice/binary/.meta/config.json @@ -1,5 +1,4 @@ { - "blurb": "Convert a binary number, represented as a string (e.g. '101010'), to its decimal equivalent using first principles.", "authors": [ "etrepum" ], @@ -23,12 +22,14 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Binary.hs" + ".meta/examples/success-standard/src/Binary.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" ] }, + "blurb": "Convert a binary number, represented as a string (e.g. '101010'), to its decimal equivalent using first principles.", "source": "All of Computer Science", "source_url": "https://www.wolframalpha.com/input/?i=binary&a=*C.binary-_*MathWorld-" } diff --git a/exercises/practice/bob/.meta/config.json b/exercises/practice/bob/.meta/config.json index eacba228f..4e58361d0 100644 --- a/exercises/practice/bob/.meta/config.json +++ b/exercises/practice/bob/.meta/config.json @@ -28,7 +28,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Bob.hs" + ".meta/examples/success-standard/src/Bob.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/book-store/.meta/config.json b/exercises/practice/book-store/.meta/config.json index 49c1b65a5..4ff51894d 100644 --- a/exercises/practice/book-store/.meta/config.json +++ b/exercises/practice/book-store/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/BookStore.hs" + ".meta/examples/success-standard/src/BookStore.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/bowling/.meta/config.json b/exercises/practice/bowling/.meta/config.json index 7bc541e72..42e480c1b 100644 --- a/exercises/practice/bowling/.meta/config.json +++ b/exercises/practice/bowling/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Bowling.hs" + ".meta/examples/success-standard/src/Bowling.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/change/.meta/config.json b/exercises/practice/change/.meta/config.json index 028010ba8..a54f96672 100644 --- a/exercises/practice/change/.meta/config.json +++ b/exercises/practice/change/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Change.hs" + ".meta/examples/success-standard/src/Change.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/clock/.meta/config.json b/exercises/practice/clock/.meta/config.json index 8f67157a8..3afd2d224 100644 --- a/exercises/practice/clock/.meta/config.json +++ b/exercises/practice/clock/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Clock.hs" + ".meta/examples/success-standard/src/Clock.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/collatz-conjecture/.meta/config.json b/exercises/practice/collatz-conjecture/.meta/config.json index 5627086eb..0bcdfc6e8 100644 --- a/exercises/practice/collatz-conjecture/.meta/config.json +++ b/exercises/practice/collatz-conjecture/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/CollatzConjecture.hs" + ".meta/examples/success-standard/src/CollatzConjecture.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/complex-numbers/.meta/config.json b/exercises/practice/complex-numbers/.meta/config.json index ff5ab3f14..5e4f4c5da 100644 --- a/exercises/practice/complex-numbers/.meta/config.json +++ b/exercises/practice/complex-numbers/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ComplexNumbers.hs" + ".meta/examples/success-standard/src/ComplexNumbers.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/connect/.meta/config.json b/exercises/practice/connect/.meta/config.json index b1be156c1..84bf34fb6 100644 --- a/exercises/practice/connect/.meta/config.json +++ b/exercises/practice/connect/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Connect.hs" + ".meta/examples/success-standard/src/Connect.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/crypto-square/.meta/config.json b/exercises/practice/crypto-square/.meta/config.json index 12b480a2f..028eaa524 100644 --- a/exercises/practice/crypto-square/.meta/config.json +++ b/exercises/practice/crypto-square/.meta/config.json @@ -26,7 +26,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/CryptoSquare.hs" + ".meta/examples/success-standard/src/CryptoSquare.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/custom-set/.meta/config.json b/exercises/practice/custom-set/.meta/config.json index 8ad994d04..584bcd6ba 100644 --- a/exercises/practice/custom-set/.meta/config.json +++ b/exercises/practice/custom-set/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/CustomSet.hs" + ".meta/examples/success-standard/src/CustomSet.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/darts/.meta/config.json b/exercises/practice/darts/.meta/config.json index 568beafcb..c12c931b7 100644 --- a/exercises/practice/darts/.meta/config.json +++ b/exercises/practice/darts/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Darts.hs" + ".meta/examples/success-standard/src/Darts.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/diamond/.meta/config.json b/exercises/practice/diamond/.meta/config.json index 70854e21f..e0d621cdf 100644 --- a/exercises/practice/diamond/.meta/config.json +++ b/exercises/practice/diamond/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Diamond.hs" + ".meta/examples/success-standard/src/Diamond.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/difference-of-squares/.meta/config.json b/exercises/practice/difference-of-squares/.meta/config.json index c867b0149..d8de5363a 100644 --- a/exercises/practice/difference-of-squares/.meta/config.json +++ b/exercises/practice/difference-of-squares/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Squares.hs" + ".meta/examples/success-standard/src/Squares.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/dnd-character/.meta/config.json b/exercises/practice/dnd-character/.meta/config.json index 0143d7923..9e71b3ad0 100644 --- a/exercises/practice/dnd-character/.meta/config.json +++ b/exercises/practice/dnd-character/.meta/config.json @@ -17,7 +17,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/DND.hs" + ".meta/examples/success-standard/src/DND.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/dominoes/.meta/config.json b/exercises/practice/dominoes/.meta/config.json index a963fa3a3..4538b41ea 100644 --- a/exercises/practice/dominoes/.meta/config.json +++ b/exercises/practice/dominoes/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Dominoes.hs" + ".meta/examples/success-standard/src/Dominoes.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/etl/.meta/config.json b/exercises/practice/etl/.meta/config.json index 4b57ff6a3..ee21813f4 100644 --- a/exercises/practice/etl/.meta/config.json +++ b/exercises/practice/etl/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ETL.hs" + ".meta/examples/success-standard/src/ETL.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/food-chain/.meta/config.json b/exercises/practice/food-chain/.meta/config.json index a42914f83..d00011d99 100644 --- a/exercises/practice/food-chain/.meta/config.json +++ b/exercises/practice/food-chain/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/FoodChain.hs" + ".meta/examples/success-standard/src/FoodChain.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/forth/.meta/config.json b/exercises/practice/forth/.meta/config.json index 3073d45fc..49eeeeee9 100644 --- a/exercises/practice/forth/.meta/config.json +++ b/exercises/practice/forth/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Forth.hs" + ".meta/examples/success-standard/src/Forth.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/game-of-life/.meta/config.json b/exercises/practice/game-of-life/.meta/config.json index b71d8fa13..877d19536 100644 --- a/exercises/practice/game-of-life/.meta/config.json +++ b/exercises/practice/game-of-life/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/GameOfLife.hs" + ".meta/examples/success-standard/src/GameOfLife.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/gigasecond/.meta/config.json b/exercises/practice/gigasecond/.meta/config.json index 8193af890..8ab9c7745 100644 --- a/exercises/practice/gigasecond/.meta/config.json +++ b/exercises/practice/gigasecond/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Gigasecond.hs" + ".meta/examples/success-standard/src/Gigasecond.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/go-counting/.meta/config.json b/exercises/practice/go-counting/.meta/config.json index bbd43d507..72cd0e66c 100644 --- a/exercises/practice/go-counting/.meta/config.json +++ b/exercises/practice/go-counting/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Counting.hs" + ".meta/examples/success-standard/src/Counting.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/grade-school/.meta/config.json b/exercises/practice/grade-school/.meta/config.json index d5eb2b898..83a221f38 100644 --- a/exercises/practice/grade-school/.meta/config.json +++ b/exercises/practice/grade-school/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/School.hs" + ".meta/examples/success-standard/src/School.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/grains/.meta/config.json b/exercises/practice/grains/.meta/config.json index 523ef22a1..d19e9b731 100644 --- a/exercises/practice/grains/.meta/config.json +++ b/exercises/practice/grains/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Grains.hs" + ".meta/examples/success-standard/src/Grains.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/hamming/.meta/config.json b/exercises/practice/hamming/.meta/config.json index 2521d679f..e9702e00e 100644 --- a/exercises/practice/hamming/.meta/config.json +++ b/exercises/practice/hamming/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Hamming.hs" + ".meta/examples/success-standard/src/Hamming.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/hello-world/.meta/config.json b/exercises/practice/hello-world/.meta/config.json index dc0596fd1..687cc38fa 100644 --- a/exercises/practice/hello-world/.meta/config.json +++ b/exercises/practice/hello-world/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/HelloWorld.hs" + ".meta/examples/success-standard/src/HelloWorld.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/hexadecimal/.meta/config.json b/exercises/practice/hexadecimal/.meta/config.json index 2be1005ef..0a635e1bc 100644 --- a/exercises/practice/hexadecimal/.meta/config.json +++ b/exercises/practice/hexadecimal/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Hexadecimal.hs" + ".meta/examples/success-standard/src/Hexadecimal.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/house/.meta/config.json b/exercises/practice/house/.meta/config.json index 962fc0071..04ddf4b8d 100644 --- a/exercises/practice/house/.meta/config.json +++ b/exercises/practice/house/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/House.hs" + ".meta/examples/success-standard/src/House.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/isbn-verifier/.meta/config.json b/exercises/practice/isbn-verifier/.meta/config.json index 2e3fd92ae..e0d87c17e 100644 --- a/exercises/practice/isbn-verifier/.meta/config.json +++ b/exercises/practice/isbn-verifier/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/IsbnVerifier.hs" + ".meta/examples/success-standard/src/IsbnVerifier.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/isogram/.meta/config.json b/exercises/practice/isogram/.meta/config.json index 844594798..84db34f2a 100644 --- a/exercises/practice/isogram/.meta/config.json +++ b/exercises/practice/isogram/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Isogram.hs" + ".meta/examples/success-standard/src/Isogram.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/kindergarten-garden/.meta/config.json b/exercises/practice/kindergarten-garden/.meta/config.json index d1bd2ce29..10d8884e3 100644 --- a/exercises/practice/kindergarten-garden/.meta/config.json +++ b/exercises/practice/kindergarten-garden/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Garden.hs" + ".meta/examples/success-standard/src/Garden.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/knapsack/.meta/config.json b/exercises/practice/knapsack/.meta/config.json index b9adedf27..86316583f 100644 --- a/exercises/practice/knapsack/.meta/config.json +++ b/exercises/practice/knapsack/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Knapsack.hs" + ".meta/examples/success-standard/src/Knapsack.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/largest-series-product/.meta/config.json b/exercises/practice/largest-series-product/.meta/config.json index df95b4e79..ddfaa13cf 100644 --- a/exercises/practice/largest-series-product/.meta/config.json +++ b/exercises/practice/largest-series-product/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Series.hs" + ".meta/examples/success-standard/src/Series.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/leap/.meta/config.json b/exercises/practice/leap/.meta/config.json index d6bdcca93..cc8a96089 100644 --- a/exercises/practice/leap/.meta/config.json +++ b/exercises/practice/leap/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/LeapYear.hs" + ".meta/examples/success-standard/src/LeapYear.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/lens-person/.meta/config.json b/exercises/practice/lens-person/.meta/config.json index 7364fe917..9be5ba29a 100644 --- a/exercises/practice/lens-person/.meta/config.json +++ b/exercises/practice/lens-person/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Person.hs" + ".meta/examples/success-standard/src/Person.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/linked-list/.meta/config.json b/exercises/practice/linked-list/.meta/config.json index 8d8515f20..9202ed49c 100644 --- a/exercises/practice/linked-list/.meta/config.json +++ b/exercises/practice/linked-list/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Deque.hs" + ".meta/examples/success-standard/src/Deque.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/list-ops/.meta/config.json b/exercises/practice/list-ops/.meta/config.json index dfc0c8336..fef89222f 100644 --- a/exercises/practice/list-ops/.meta/config.json +++ b/exercises/practice/list-ops/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ListOps.hs" + ".meta/examples/success-standard/src/ListOps.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/luhn/.meta/config.json b/exercises/practice/luhn/.meta/config.json index 6f027e9f7..727c6223e 100644 --- a/exercises/practice/luhn/.meta/config.json +++ b/exercises/practice/luhn/.meta/config.json @@ -26,7 +26,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Luhn.hs" + ".meta/examples/success-standard/src/Luhn.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/matching-brackets/.meta/config.json b/exercises/practice/matching-brackets/.meta/config.json index a5c988397..ff25af320 100644 --- a/exercises/practice/matching-brackets/.meta/config.json +++ b/exercises/practice/matching-brackets/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Brackets.hs" + ".meta/examples/success-standard/src/Brackets.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/matrix/.meta/config.json b/exercises/practice/matrix/.meta/config.json index 96961c139..4fdad3f63 100644 --- a/exercises/practice/matrix/.meta/config.json +++ b/exercises/practice/matrix/.meta/config.json @@ -26,7 +26,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Matrix.hs" + ".meta/examples/success-standard/src/Matrix.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/meetup/.meta/config.json b/exercises/practice/meetup/.meta/config.json index c7ef159ce..2568491e2 100644 --- a/exercises/practice/meetup/.meta/config.json +++ b/exercises/practice/meetup/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Meetup.hs" + ".meta/examples/success-standard/src/Meetup.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/minesweeper/.meta/config.json b/exercises/practice/minesweeper/.meta/config.json index d19f1ccf1..8c130687a 100644 --- a/exercises/practice/minesweeper/.meta/config.json +++ b/exercises/practice/minesweeper/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Minesweeper.hs" + ".meta/examples/success-standard/src/Minesweeper.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/nth-prime/.meta/config.json b/exercises/practice/nth-prime/.meta/config.json index 193d07777..d62803c62 100644 --- a/exercises/practice/nth-prime/.meta/config.json +++ b/exercises/practice/nth-prime/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Prime.hs" + ".meta/examples/success-standard/src/Prime.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/nucleotide-count/.meta/config.json b/exercises/practice/nucleotide-count/.meta/config.json index e2f6ccca6..a9cae60d9 100644 --- a/exercises/practice/nucleotide-count/.meta/config.json +++ b/exercises/practice/nucleotide-count/.meta/config.json @@ -27,7 +27,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/DNA.hs" + ".meta/examples/success-standard/src/DNA.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/ocr-numbers/.meta/config.json b/exercises/practice/ocr-numbers/.meta/config.json index 38394ec8f..7f9fadd1b 100644 --- a/exercises/practice/ocr-numbers/.meta/config.json +++ b/exercises/practice/ocr-numbers/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/OCR.hs" + ".meta/examples/success-standard/src/OCR.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/octal/.meta/config.json b/exercises/practice/octal/.meta/config.json index bc9a518e8..201774dc1 100644 --- a/exercises/practice/octal/.meta/config.json +++ b/exercises/practice/octal/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Octal.hs" + ".meta/examples/success-standard/src/Octal.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/palindrome-products/.meta/config.json b/exercises/practice/palindrome-products/.meta/config.json index 239372d50..9907f885f 100644 --- a/exercises/practice/palindrome-products/.meta/config.json +++ b/exercises/practice/palindrome-products/.meta/config.json @@ -26,7 +26,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Palindromes.hs" + ".meta/examples/success-standard/src/Palindromes.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/pangram/.meta/config.json b/exercises/practice/pangram/.meta/config.json index 3f21c7b49..99dd4f229 100644 --- a/exercises/practice/pangram/.meta/config.json +++ b/exercises/practice/pangram/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Pangram.hs" + ".meta/examples/success-standard/src/Pangram.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/parallel-letter-frequency/.meta/config.json b/exercises/practice/parallel-letter-frequency/.meta/config.json index 68b4f20c5..81ca6eb6b 100644 --- a/exercises/practice/parallel-letter-frequency/.meta/config.json +++ b/exercises/practice/parallel-letter-frequency/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Frequency.hs" + ".meta/examples/success-standard/src/Frequency.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/pascals-triangle/.meta/config.json b/exercises/practice/pascals-triangle/.meta/config.json index e11ecfd59..2f423f997 100644 --- a/exercises/practice/pascals-triangle/.meta/config.json +++ b/exercises/practice/pascals-triangle/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Triangle.hs" + ".meta/examples/success-standard/src/Triangle.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/perfect-numbers/.meta/config.json b/exercises/practice/perfect-numbers/.meta/config.json index 7ba2323ff..ae233c022 100644 --- a/exercises/practice/perfect-numbers/.meta/config.json +++ b/exercises/practice/perfect-numbers/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/PerfectNumbers.hs" + ".meta/examples/success-standard/src/PerfectNumbers.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/phone-number/.meta/config.json b/exercises/practice/phone-number/.meta/config.json index 841a0ee5f..3b1d2bd98 100644 --- a/exercises/practice/phone-number/.meta/config.json +++ b/exercises/practice/phone-number/.meta/config.json @@ -27,7 +27,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Phone.hs" + ".meta/examples/success-standard/src/Phone.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/pig-latin/.meta/config.json b/exercises/practice/pig-latin/.meta/config.json index 01f97d2bc..0997e128a 100644 --- a/exercises/practice/pig-latin/.meta/config.json +++ b/exercises/practice/pig-latin/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/PigLatin.hs" + ".meta/examples/success-standard/src/PigLatin.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/poker/.meta/config.json b/exercises/practice/poker/.meta/config.json index b1b958349..29349e36f 100644 --- a/exercises/practice/poker/.meta/config.json +++ b/exercises/practice/poker/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Poker.hs" + ".meta/examples/success-standard/src/Poker.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/pov/.meta/config.json b/exercises/practice/pov/.meta/config.json index d02ccc25c..da9133165 100644 --- a/exercises/practice/pov/.meta/config.json +++ b/exercises/practice/pov/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/POV.hs" + ".meta/examples/success-standard/src/POV.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/prime-factors/.meta/config.json b/exercises/practice/prime-factors/.meta/config.json index 96d7f8cc6..f5c197806 100644 --- a/exercises/practice/prime-factors/.meta/config.json +++ b/exercises/practice/prime-factors/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/PrimeFactors.hs" + ".meta/examples/success-standard/src/PrimeFactors.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/protein-translation/.meta/config.json b/exercises/practice/protein-translation/.meta/config.json index a409bf858..26377d057 100644 --- a/exercises/practice/protein-translation/.meta/config.json +++ b/exercises/practice/protein-translation/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ProteinTranslation.hs" + ".meta/examples/success-standard/src/ProteinTranslation.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/proverb/.meta/config.json b/exercises/practice/proverb/.meta/config.json index 9aa8b822a..723c17299 100644 --- a/exercises/practice/proverb/.meta/config.json +++ b/exercises/practice/proverb/.meta/config.json @@ -17,7 +17,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Proverb.hs" + ".meta/examples/success-standard/src/Proverb.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/pythagorean-triplet/.meta/config.json b/exercises/practice/pythagorean-triplet/.meta/config.json index 8ecc83705..071b483aa 100644 --- a/exercises/practice/pythagorean-triplet/.meta/config.json +++ b/exercises/practice/pythagorean-triplet/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Triplet.hs" + ".meta/examples/success-standard/src/Triplet.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/queen-attack/.meta/config.json b/exercises/practice/queen-attack/.meta/config.json index 730f0f759..cfd26a6aa 100644 --- a/exercises/practice/queen-attack/.meta/config.json +++ b/exercises/practice/queen-attack/.meta/config.json @@ -27,7 +27,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Queens.hs" + ".meta/examples/success-standard/src/Queens.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/rail-fence-cipher/.meta/config.json b/exercises/practice/rail-fence-cipher/.meta/config.json index 1e121f6b0..4b0cc424c 100644 --- a/exercises/practice/rail-fence-cipher/.meta/config.json +++ b/exercises/practice/rail-fence-cipher/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/RailFenceCipher.hs" + ".meta/examples/success-standard/src/RailFenceCipher.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/raindrops/.meta/config.json b/exercises/practice/raindrops/.meta/config.json index 9ec8e0536..402f372d4 100644 --- a/exercises/practice/raindrops/.meta/config.json +++ b/exercises/practice/raindrops/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Raindrops.hs" + ".meta/examples/success-standard/src/Raindrops.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/rational-numbers/.meta/config.json b/exercises/practice/rational-numbers/.meta/config.json index 5c02fd8f9..ddf9471ef 100644 --- a/exercises/practice/rational-numbers/.meta/config.json +++ b/exercises/practice/rational-numbers/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/RationalNumbers.hs" + ".meta/examples/success-standard/src/RationalNumbers.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/resistor-color-duo/.meta/config.json b/exercises/practice/resistor-color-duo/.meta/config.json index defb837c0..35b945a2e 100644 --- a/exercises/practice/resistor-color-duo/.meta/config.json +++ b/exercises/practice/resistor-color-duo/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ResistorColors.hs" + ".meta/examples/success-standard/src/ResistorColors.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/resistor-color-trio/.meta/config.json b/exercises/practice/resistor-color-trio/.meta/config.json index 80d4d249b..7835bc281 100644 --- a/exercises/practice/resistor-color-trio/.meta/config.json +++ b/exercises/practice/resistor-color-trio/.meta/config.json @@ -15,7 +15,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ResistorColors.hs" + ".meta/examples/success-standard/src/ResistorColors.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/reverse-string/.meta/config.json b/exercises/practice/reverse-string/.meta/config.json index 2ae6465be..ce33636df 100644 --- a/exercises/practice/reverse-string/.meta/config.json +++ b/exercises/practice/reverse-string/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ReverseString.hs" + ".meta/examples/success-standard/src/ReverseString.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/rna-transcription/.meta/config.json b/exercises/practice/rna-transcription/.meta/config.json index a3f67b168..e59ae6710 100644 --- a/exercises/practice/rna-transcription/.meta/config.json +++ b/exercises/practice/rna-transcription/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/DNA.hs" + ".meta/examples/success-standard/src/DNA.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/robot-name/.meta/config.json b/exercises/practice/robot-name/.meta/config.json index fd9b0b3fe..56cfde7cc 100644 --- a/exercises/practice/robot-name/.meta/config.json +++ b/exercises/practice/robot-name/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Robot.hs" + ".meta/examples/success-standard/src/Robot.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/robot-simulator/.meta/config.json b/exercises/practice/robot-simulator/.meta/config.json index 7b7587de5..1304417fe 100644 --- a/exercises/practice/robot-simulator/.meta/config.json +++ b/exercises/practice/robot-simulator/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Robot.hs" + ".meta/examples/success-standard/src/Robot.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/roman-numerals/.meta/config.json b/exercises/practice/roman-numerals/.meta/config.json index 422e2fad8..92c1abd7e 100644 --- a/exercises/practice/roman-numerals/.meta/config.json +++ b/exercises/practice/roman-numerals/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Roman.hs" + ".meta/examples/success-standard/src/Roman.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/rotational-cipher/.meta/config.json b/exercises/practice/rotational-cipher/.meta/config.json index 09eecb7b2..7b448cf17 100644 --- a/exercises/practice/rotational-cipher/.meta/config.json +++ b/exercises/practice/rotational-cipher/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/RotationalCipher.hs" + ".meta/examples/success-standard/src/RotationalCipher.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/run-length-encoding/.meta/config.json b/exercises/practice/run-length-encoding/.meta/config.json index 28c74d467..5c8b85408 100644 --- a/exercises/practice/run-length-encoding/.meta/config.json +++ b/exercises/practice/run-length-encoding/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/RunLength.hs" + ".meta/examples/success-standard/src/RunLength.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/saddle-points/.meta/config.json b/exercises/practice/saddle-points/.meta/config.json index 789ea3ae1..7aafd6c7f 100644 --- a/exercises/practice/saddle-points/.meta/config.json +++ b/exercises/practice/saddle-points/.meta/config.json @@ -25,7 +25,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Matrix.hs" + ".meta/examples/success-standard/src/Matrix.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/satellite/.meta/config.json b/exercises/practice/satellite/.meta/config.json index a90de56b3..ec524f726 100644 --- a/exercises/practice/satellite/.meta/config.json +++ b/exercises/practice/satellite/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Satellite.hs" + ".meta/examples/success-standard/src/Satellite.hs", + ".meta/examples/success-standard/package.yaml" ], "editor": [ "src/BinaryTree.hs" diff --git a/exercises/practice/say/.meta/config.json b/exercises/practice/say/.meta/config.json index c57e280bb..b31d0c02c 100644 --- a/exercises/practice/say/.meta/config.json +++ b/exercises/practice/say/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Say.hs" + ".meta/examples/success-standard/src/Say.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/scrabble-score/.meta/config.json b/exercises/practice/scrabble-score/.meta/config.json index b22744224..d7834ec85 100644 --- a/exercises/practice/scrabble-score/.meta/config.json +++ b/exercises/practice/scrabble-score/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Scrabble.hs" + ".meta/examples/success-standard/src/Scrabble.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/secret-handshake/.meta/config.json b/exercises/practice/secret-handshake/.meta/config.json index 152be7bd5..eaeec990e 100644 --- a/exercises/practice/secret-handshake/.meta/config.json +++ b/exercises/practice/secret-handshake/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/SecretHandshake.hs" + ".meta/examples/success-standard/src/SecretHandshake.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/series/.meta/config.json b/exercises/practice/series/.meta/config.json index 1f4ea1391..0250a2f30 100644 --- a/exercises/practice/series/.meta/config.json +++ b/exercises/practice/series/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Series.hs" + ".meta/examples/success-standard/src/Series.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/sgf-parsing/.meta/config.json b/exercises/practice/sgf-parsing/.meta/config.json index a8cd51e47..ca607c010 100644 --- a/exercises/practice/sgf-parsing/.meta/config.json +++ b/exercises/practice/sgf-parsing/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Sgf.hs" + ".meta/examples/success-standard/src/Sgf.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/sieve/.meta/config.json b/exercises/practice/sieve/.meta/config.json index db4482cd2..bcea28773 100644 --- a/exercises/practice/sieve/.meta/config.json +++ b/exercises/practice/sieve/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Sieve.hs" + ".meta/examples/success-standard/src/Sieve.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/simple-cipher/.meta/config.json b/exercises/practice/simple-cipher/.meta/config.json index 545d11424..d8a520012 100644 --- a/exercises/practice/simple-cipher/.meta/config.json +++ b/exercises/practice/simple-cipher/.meta/config.json @@ -26,7 +26,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Cipher.hs" + ".meta/examples/success-standard/src/Cipher.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/simple-linked-list/.meta/config.json b/exercises/practice/simple-linked-list/.meta/config.json index 1bcafd485..74975afad 100644 --- a/exercises/practice/simple-linked-list/.meta/config.json +++ b/exercises/practice/simple-linked-list/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/LinkedList.hs" + ".meta/examples/success-standard/src/LinkedList.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/space-age/.meta/config.json b/exercises/practice/space-age/.meta/config.json index 55cdeb1d7..6001c9bfd 100644 --- a/exercises/practice/space-age/.meta/config.json +++ b/exercises/practice/space-age/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-double/src/SpaceAge.hs" + ".meta/examples/success-double/src/SpaceAge.hs", + ".meta/examples/success-double/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/spiral-matrix/.meta/config.json b/exercises/practice/spiral-matrix/.meta/config.json index 643b4b5f0..230e49b0d 100644 --- a/exercises/practice/spiral-matrix/.meta/config.json +++ b/exercises/practice/spiral-matrix/.meta/config.json @@ -19,7 +19,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Spiral.hs" + ".meta/examples/success-standard/src/Spiral.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/state-of-tic-tac-toe/.meta/config.json b/exercises/practice/state-of-tic-tac-toe/.meta/config.json index b98b0f4ee..604b07283 100644 --- a/exercises/practice/state-of-tic-tac-toe/.meta/config.json +++ b/exercises/practice/state-of-tic-tac-toe/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/StateOfTicTacToe.hs" + ".meta/examples/success-standard/src/StateOfTicTacToe.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/strain/.meta/config.json b/exercises/practice/strain/.meta/config.json index c55dc2eb2..b8a1e4098 100644 --- a/exercises/practice/strain/.meta/config.json +++ b/exercises/practice/strain/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Strain.hs" + ".meta/examples/success-standard/src/Strain.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/sublist/.meta/config.json b/exercises/practice/sublist/.meta/config.json index a3b71844d..ca0e85f84 100644 --- a/exercises/practice/sublist/.meta/config.json +++ b/exercises/practice/sublist/.meta/config.json @@ -21,7 +21,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Sublist.hs" + ".meta/examples/success-standard/src/Sublist.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/sum-of-multiples/.meta/config.json b/exercises/practice/sum-of-multiples/.meta/config.json index 41248b6e1..126ef8dc7 100644 --- a/exercises/practice/sum-of-multiples/.meta/config.json +++ b/exercises/practice/sum-of-multiples/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/SumOfMultiples.hs" + ".meta/examples/success-standard/src/SumOfMultiples.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/transpose/.meta/config.json b/exercises/practice/transpose/.meta/config.json index 19c72ae42..ade4cf576 100644 --- a/exercises/practice/transpose/.meta/config.json +++ b/exercises/practice/transpose/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Transpose.hs" + ".meta/examples/success-standard/src/Transpose.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/triangle/.meta/config.json b/exercises/practice/triangle/.meta/config.json index 745ceb78e..f408d5650 100644 --- a/exercises/practice/triangle/.meta/config.json +++ b/exercises/practice/triangle/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Triangle.hs" + ".meta/examples/success-standard/src/Triangle.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/trinary/.meta/config.json b/exercises/practice/trinary/.meta/config.json index 6ea425417..2f14a7a42 100644 --- a/exercises/practice/trinary/.meta/config.json +++ b/exercises/practice/trinary/.meta/config.json @@ -23,7 +23,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Trinary.hs" + ".meta/examples/success-standard/src/Trinary.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/twelve-days/.meta/config.json b/exercises/practice/twelve-days/.meta/config.json index 74332c327..aff06067a 100644 --- a/exercises/practice/twelve-days/.meta/config.json +++ b/exercises/practice/twelve-days/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/TwelveDays.hs" + ".meta/examples/success-standard/src/TwelveDays.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/two-bucket/.meta/config.json b/exercises/practice/two-bucket/.meta/config.json index eb190e589..12d6fc4b1 100644 --- a/exercises/practice/two-bucket/.meta/config.json +++ b/exercises/practice/two-bucket/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/TwoBucket.hs" + ".meta/examples/success-standard/src/TwoBucket.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/word-count/.meta/config.json b/exercises/practice/word-count/.meta/config.json index f090213ea..88023eb95 100644 --- a/exercises/practice/word-count/.meta/config.json +++ b/exercises/practice/word-count/.meta/config.json @@ -24,7 +24,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-simple/src/WordCount.hs" + ".meta/examples/success-simple/src/WordCount.hs", + ".meta/examples/success-simple/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/word-search/.meta/config.json b/exercises/practice/word-search/.meta/config.json index 718ac47d1..ec4aa08bd 100644 --- a/exercises/practice/word-search/.meta/config.json +++ b/exercises/practice/word-search/.meta/config.json @@ -11,7 +11,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/WordSearch.hs" + ".meta/examples/success-standard/src/WordSearch.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/wordy/.meta/config.json b/exercises/practice/wordy/.meta/config.json index 9d4c8f8bf..4a0f1ede8 100644 --- a/exercises/practice/wordy/.meta/config.json +++ b/exercises/practice/wordy/.meta/config.json @@ -22,7 +22,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/WordProblem.hs" + ".meta/examples/success-standard/src/WordProblem.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/yacht/.meta/config.json b/exercises/practice/yacht/.meta/config.json index e35cd47b0..4ac1696d9 100644 --- a/exercises/practice/yacht/.meta/config.json +++ b/exercises/practice/yacht/.meta/config.json @@ -18,7 +18,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Yacht.hs" + ".meta/examples/success-standard/src/Yacht.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/zebra-puzzle/.meta/config.json b/exercises/practice/zebra-puzzle/.meta/config.json index b1f904c07..eca013702 100644 --- a/exercises/practice/zebra-puzzle/.meta/config.json +++ b/exercises/practice/zebra-puzzle/.meta/config.json @@ -17,7 +17,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/ZebraPuzzle.hs" + ".meta/examples/success-standard/src/ZebraPuzzle.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" diff --git a/exercises/practice/zipper/.meta/config.json b/exercises/practice/zipper/.meta/config.json index 800cd81bb..350a884bf 100644 --- a/exercises/practice/zipper/.meta/config.json +++ b/exercises/practice/zipper/.meta/config.json @@ -20,7 +20,8 @@ "test/Tests.hs" ], "example": [ - ".meta/examples/success-standard/src/Zipper.hs" + ".meta/examples/success-standard/src/Zipper.hs", + ".meta/examples/success-standard/package.yaml" ], "invalidator": [ "stack.yaml" From 96d632ec89224af428b8689d6ed50d6af8b558e0 Mon Sep 17 00:00:00 2001 From: tofische Date: Thu, 14 May 2026 20:04:37 +0200 Subject: [PATCH 03/19] Use exemplar instead of example for concept exercises. --- exercises/concept/guessing-game/.meta/config.json | 2 +- exercises/concept/lucians-luscious-lasagna/.meta/config.json | 2 +- exercises/concept/pacman-rules/.meta/config.json | 2 +- exercises/concept/temperature/.meta/config.json | 2 +- exercises/concept/valentines-day/.meta/config.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/exercises/concept/guessing-game/.meta/config.json b/exercises/concept/guessing-game/.meta/config.json index 3a054f081..e9acaf8b7 100644 --- a/exercises/concept/guessing-game/.meta/config.json +++ b/exercises/concept/guessing-game/.meta/config.json @@ -10,7 +10,7 @@ "test": [ "test/Tests.hs" ], - "example": [ + "exemplar": [ ".meta/exemplar/src/GuessingGame.hs", ".meta/exemplar/package.yaml" ], diff --git a/exercises/concept/lucians-luscious-lasagna/.meta/config.json b/exercises/concept/lucians-luscious-lasagna/.meta/config.json index 1bb04063f..24a121a38 100644 --- a/exercises/concept/lucians-luscious-lasagna/.meta/config.json +++ b/exercises/concept/lucians-luscious-lasagna/.meta/config.json @@ -10,7 +10,7 @@ "test": [ "test/Tests.hs" ], - "example": [ + "exemplar": [ ".meta/exemplar/src/LuciansLusciousLasagna.hs", ".meta/exemplar/package.yaml" ], diff --git a/exercises/concept/pacman-rules/.meta/config.json b/exercises/concept/pacman-rules/.meta/config.json index f62cf9fef..656a583e7 100644 --- a/exercises/concept/pacman-rules/.meta/config.json +++ b/exercises/concept/pacman-rules/.meta/config.json @@ -10,7 +10,7 @@ "test": [ "test/Tests.hs" ], - "example": [ + "exemplar": [ ".meta/exemplar/src/PacmanRules.hs", ".meta/exemplar/package.yaml" ], diff --git a/exercises/concept/temperature/.meta/config.json b/exercises/concept/temperature/.meta/config.json index 5827b6318..a232bc3d4 100644 --- a/exercises/concept/temperature/.meta/config.json +++ b/exercises/concept/temperature/.meta/config.json @@ -10,7 +10,7 @@ "test": [ "test/Tests.hs" ], - "example": [ + "exemplar": [ ".meta/exemplar/src/Temperature.hs", ".meta/exemplar/package.yaml" ], diff --git a/exercises/concept/valentines-day/.meta/config.json b/exercises/concept/valentines-day/.meta/config.json index 12e817eae..d9b7e0461 100644 --- a/exercises/concept/valentines-day/.meta/config.json +++ b/exercises/concept/valentines-day/.meta/config.json @@ -10,7 +10,7 @@ "test": [ "test/Tests.hs" ], - "example": [ + "exemplar": [ ".meta/exemplar/src/ValentinesDay.hs", ".meta/exemplar/package.yaml" ], From 439c85a6d3fe1295a6257e6cb2454a50f4b9a753 Mon Sep 17 00:00:00 2001 From: keiravillekode Date: Fri, 15 May 2026 04:37:06 +1000 Subject: [PATCH 04/19] bin/verify-exercises-in-docker script (#1295) * bin/verify-exercises-in-docker script * skip deprecated exercises --- bin/verify-exercises-in-docker | 107 +++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100755 bin/verify-exercises-in-docker diff --git a/bin/verify-exercises-in-docker b/bin/verify-exercises-in-docker new file mode 100755 index 000000000..a157a3d1c --- /dev/null +++ b/bin/verify-exercises-in-docker @@ -0,0 +1,107 @@ +#!/usr/bin/env bash + +# Synopsis: +# Verify that each exercise's example/exemplar solution passes the tests +# using the track's test runner Docker image. +# You can either verify all exercises or a single exercise. + +# Example: verify all exercises in Docker +# bin/verify-exercises-in-docker + +# Example: verify single exercise in Docker +# bin/verify-exercises-in-docker two-fer + +set -eo pipefail + +die() { echo "$*" >&2; exit 1; } + +required_tool() { + command -v "${1}" >/dev/null 2>&1 || + die "${1} is required but not installed. Please install it and make sure it's in your PATH." +} + +required_tool docker + +copy_example_or_examplar_to_solution() { + jq -r '[.files.solution, .files.exemplar // .files.example] | transpose | map(select(.[0] and .[1]))[][]' .meta/config.json \ + | while read -r dst; read -r src; do + cp "${src}" "${dst}" + done +} + +pull_docker_image() { + docker pull "${image}" || + die $'Could not find the `'"${image}"$'` Docker image.\nCheck the test runner docs at https://exercism.org/docs/building/tooling/test-runners for more information.' +} + +run_tests() { + local slug + slug="${1}" + + docker run \ + --rm \ + --network none \ + --mount type=bind,src="${PWD}",dst=/solution \ + --mount type=bind,src="${PWD}",dst=/output \ + --mount type=tmpfs,dst=/tmp \ + "${image}" "${slug}" /solution /output + jq -e '.status == "pass"' "${PWD}/results.json" >/dev/null 2>&1 +} + +verify_exercise() { + local dir + local slug + local tmp_dir + dir=$(realpath "${1}") + slug=$(basename "${dir}") + + if jq -e --arg slug "${slug}" '.exercises.practice[] | select(.slug == $slug and .status == "deprecated")' config.json >/dev/null 2>&1; then + echo "Skipping ${slug} (deprecated)..." + return 0 + fi + + tmp_dir=$(mktemp -d -t "exercism-verify-${slug}-XXXXX") + + echo "Verifying ${slug} exercise..." + + ( + trap 'rm -rf "$tmp_dir"' EXIT # remove tempdir when subshell ends + cp -r "${dir}/." "${tmp_dir}" + cd "${tmp_dir}" + + copy_example_or_examplar_to_solution + run_tests "${slug}" || { cat "${PWD}/results.json"; exit 1; } + ) +} + +verify_exercises() { + local exercise_slug + exercise_slug="${1}" + + shopt -s nullglob + count=0 + for exercise_dir in ./exercises/{concept,practice}/${exercise_slug}/; do + if [[ -d "${exercise_dir}" ]]; then + verify_exercise "${exercise_dir}" + ((++count)) + fi + done + ((count > 0)) || die 'no matching exercises found!' +} + +image='' +while getopts :i: opt; do + case $opt in + i) image=$OPTARG ;; + ?) echo >&2 "Unknown option: -$OPTARG"; exit 1 ;; + esac +done +shift "$((OPTIND - 1))" + +if [[ -z "${image}" ]]; then + image="exercism/haskell-test-runner" + pull_docker_image +fi + +exercise_slug="${1:-*}" +verify_exercises "${exercise_slug}" From c63f49e400b790ea8d7455a13df7ddc656c55376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Thu, 14 May 2026 11:40:41 -0700 Subject: [PATCH 05/19] Fix typo in TESTS.md (#1284) --- docs/TESTS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/TESTS.md b/docs/TESTS.md index 97d1feb2c..246f65e48 100644 --- a/docs/TESTS.md +++ b/docs/TESTS.md @@ -64,7 +64,7 @@ someFunc :: ... someFunc ... ``` -You'll a find a file with this name already in place in `src/`, +You'll find a file with this name already in place in `src/`, which you can use as a starting point for your solution. Just keep in mind that this *stub* is there just for you to get started. From ae3df78f29ea3c3d04fc6a6fdcd7ac8626369a77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 08:51:21 +0200 Subject: [PATCH 06/19] build(deps): bump actions/checkout from 4.1.7 to 6.0.2 (#1281) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.7 to 6.0.2. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/692973e3d937129bcbf40652eb9f2f61becf3332...de0fac2e4500dabe0009e67214ff5f5447ce83dd) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 4.2.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c877029bc..5158ee979 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: name: Check track configuration runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: # main is needed in addition to HEAD, because the README check only # checks exercises changed since main. This fetches the entire repo's @@ -65,7 +65,7 @@ jobs: # and an admin only needs to make "Check exercises (lts-from-exercises)" required. - lts-from-exercises steps: - - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install yq (for stack resolvers) run: | From 058ba418f35e43bcead0f52ee49b3a2d97a80ec0 Mon Sep 17 00:00:00 2001 From: keiravillekode Date: Fri, 15 May 2026 17:37:24 +1000 Subject: [PATCH 07/19] ci uses ubuntu-24.04 (#1290) * ci uses ubuntu-24.04 * actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 * yq v4.46.1 --------- Co-authored-by: Tomas Fischer --- .github/workflows/tests.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5158ee979..8c7c38fe0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -11,7 +11,7 @@ on: jobs: track-config: name: Check track configuration - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: @@ -25,9 +25,10 @@ jobs: - name: Install yq (for stack resolvers) run: | - sudo add-apt-repository -y ppa:rmescandon/yq - sudo apt-get -q update - sudo apt-get -y install yq + sudo apt-get update + sudo apt-get -y install wget + wget https://github.com/mikefarah/yq/releases/download/v4.46.1/yq_linux_amd64 -O /usr/local/bin/yq + chmod +x /usr/local/bin/yq - name: Ensure stack resolvers are synced run: bin/ensure-stack-resolvers-are-synced.sh @@ -47,7 +48,7 @@ jobs: exercises: name: Check exercises - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 strategy: matrix: resolver: @@ -69,9 +70,10 @@ jobs: - name: Install yq (for stack resolvers) run: | - sudo add-apt-repository -y ppa:rmescandon/yq - sudo apt-get -q update - sudo apt-get -y install yq + sudo apt-get update + sudo apt-get -y install wget + wget https://github.com/mikefarah/yq/releases/download/v4.46.1/yq_linux_amd64 -O /usr/local/bin/yq + chmod +x /usr/local/bin/yq - name: Resolve resolver id: resolve-resolver @@ -95,7 +97,7 @@ jobs: # most of the time caches should hit. echo "::set-output name=week-no::$(date -u +%Y-%U)" - - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 id: cache with: path: | From 6be2f84430a1af6246da3a211eb6915b851f0f0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 11:59:09 +0200 Subject: [PATCH 08/19] build(deps): bump actions/cache from 4.3.0 to 5.0.5 (#1280) Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0057852bfaa89a56745cba8c7296529d2fc39830...27d5ce7f107fe9357f9df03efb73ab90386fccae) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.1.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tomas Fischer From 68a7b4a166e3f892e7dee37d24ba9d1239b8752d Mon Sep 17 00:00:00 2001 From: meatball <69751659+meatball133@users.noreply.github.com> Date: Fri, 15 May 2026 16:53:22 +0200 Subject: [PATCH 09/19] Rework Bools concept (#1278) * Rework bool concept * Remove Crystal mention * Remove vsc file --- concepts/booleans/.meta/config.json | 3 +- concepts/booleans/about.md | 83 ++++++++++++++++-- concepts/booleans/introduction.md | 85 +++++++++++++++++- concepts/booleans/links.json | 7 +- .../pacman-rules/.docs/instructions.md | 8 +- .../pacman-rules/.docs/introduction.md | 86 +++++++++++++++++-- .../concept/pacman-rules/.meta/config.json | 3 + 7 files changed, 253 insertions(+), 22 deletions(-) diff --git a/concepts/booleans/.meta/config.json b/concepts/booleans/.meta/config.json index 6fdee8b8e..575d91464 100644 --- a/concepts/booleans/.meta/config.json +++ b/concepts/booleans/.meta/config.json @@ -2,6 +2,7 @@ "blurb": "Booleans are either true or false. They support NOT, AND, and OR operators.", "authors": [ "ErikSchierboom", - "pwadsworth" + "pwadsworth", + "meatball133" ] } \ No newline at end of file diff --git a/concepts/booleans/about.md b/concepts/booleans/about.md index a2d50e84d..1349c6f70 100644 --- a/concepts/booleans/about.md +++ b/concepts/booleans/about.md @@ -1,15 +1,84 @@ -# About +# Bools -The boolean type `Bool` is an enumeration of `True` and `False`. The basic boolean operators are `&&` (and), `||` (or), and `not`. +Haskell has a type known as [`Bool`][bools]. +It is an enumeration of `True` and `False`. + +## Logical operators + +Haskell has three logical operators (`not`, `||`, `&&`), which combine Bools and make expressions that produce different values. + +### And(`&&`) + +The [_and_ operator][and] in Haskell is represented by `&&` and returns `True` if both values are `True`; otherwise, it returns `False`. +When using the _and_ operator, one Bool is placed on the right side of the `&&` and another on the left side. + +```haskell +True && True +-- -> True + +True && False +-- -> False +``` + +### Or(`||`) + +The [_or_ operator][or] in Haskell is represented by `||` and returns `True` if **at least one** of the values given is `True`. +If both of the values are `False`, then it returns `False`. +When using the _or_ operator, one Bool should be placed on the right side of the `||` and another on the left. ```haskell -True || False -- True -True && False -- False +True || True +-- -> True + +True || False +-- -> True + +False || False +-- -> False ``` -The three boolean operators each have a different operator precedence. They are evaluated in this order: `not` first, `&&` second, and finally `||`. If you want to override these rules, you can enclose a boolean expression in parentheses (`()`), as the parentheses have an even higher operator precedence. +### Not(`not`) + +The _not_ operator in Haskell is represented by `not` and returns `True` if the given Bool is `False` and returns `False` if `True` is provided. +When using the _not_ operator, one Bool should be placed after the operator (`not`). ```haskell -not True && False -- False -not (True && False) -- True +not True +-- -> False + +not False +-- -> True ``` + +## Using parentheses(`()`) + +When working with booleans, you can use parentheses to decide which Bools to evaluate first. +The result can differ depending on how the parentheses are used. +In Haskell, what is in parentheses is evaluated first. + +```haskell +True && False && False || True +-- -> True + +True && False && (False || True) +-- -> False +``` + +Since what is in parentheses is evaluated first, the _not_ operator will apply to the expression inside parentheses in the following example. + +```haskell +not True && False +-- -> False + +not (True && False) +-- -> True +``` + +~~~~exercism/note +You should only use parentheses when they affect the result; otherwise, they should be omitted. +~~~~ + +[bools]: https://hackage.haskell.org/package/base/docs/Data-Bool.html +[and]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-38--38- +[or]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-124--124- +[not]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:not diff --git a/concepts/booleans/introduction.md b/concepts/booleans/introduction.md index 4f9e00cee..1349c6f70 100644 --- a/concepts/booleans/introduction.md +++ b/concepts/booleans/introduction.md @@ -1,7 +1,84 @@ -# Introduction +# Bools -Booleans in Haskell are represented by the `Bool` type, which values can be either `True` or `False`. +Haskell has a type known as [`Bool`][bools]. +It is an enumeration of `True` and `False`. -Haskell supports three boolean operators: `not` (NOT), `&&` (AND), and `||` (OR). +## Logical operators -The three boolean operators each have a different operator precedence. They are evaluated in this order: `not` first, `&&` second, and finally `||`. If you want to override these rules, you can enclose a boolean expression in parentheses (`()`), as the parentheses have an even higher operator precedence. +Haskell has three logical operators (`not`, `||`, `&&`), which combine Bools and make expressions that produce different values. + +### And(`&&`) + +The [_and_ operator][and] in Haskell is represented by `&&` and returns `True` if both values are `True`; otherwise, it returns `False`. +When using the _and_ operator, one Bool is placed on the right side of the `&&` and another on the left side. + +```haskell +True && True +-- -> True + +True && False +-- -> False +``` + +### Or(`||`) + +The [_or_ operator][or] in Haskell is represented by `||` and returns `True` if **at least one** of the values given is `True`. +If both of the values are `False`, then it returns `False`. +When using the _or_ operator, one Bool should be placed on the right side of the `||` and another on the left. + +```haskell +True || True +-- -> True + +True || False +-- -> True + +False || False +-- -> False +``` + +### Not(`not`) + +The _not_ operator in Haskell is represented by `not` and returns `True` if the given Bool is `False` and returns `False` if `True` is provided. +When using the _not_ operator, one Bool should be placed after the operator (`not`). + +```haskell +not True +-- -> False + +not False +-- -> True +``` + +## Using parentheses(`()`) + +When working with booleans, you can use parentheses to decide which Bools to evaluate first. +The result can differ depending on how the parentheses are used. +In Haskell, what is in parentheses is evaluated first. + +```haskell +True && False && False || True +-- -> True + +True && False && (False || True) +-- -> False +``` + +Since what is in parentheses is evaluated first, the _not_ operator will apply to the expression inside parentheses in the following example. + +```haskell +not True && False +-- -> False + +not (True && False) +-- -> True +``` + +~~~~exercism/note +You should only use parentheses when they affect the result; otherwise, they should be omitted. +~~~~ + +[bools]: https://hackage.haskell.org/package/base/docs/Data-Bool.html +[and]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-38--38- +[or]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-124--124- +[not]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:not diff --git a/concepts/booleans/links.json b/concepts/booleans/links.json index 0637a088a..833fe0ed8 100644 --- a/concepts/booleans/links.json +++ b/concepts/booleans/links.json @@ -1 +1,6 @@ -[] \ No newline at end of file +[ + { + "url": "https://hackage.haskell.org/package/base/docs/Data-Bool.html", + "description": "Prelude: Data.Bool" + } +] \ No newline at end of file diff --git a/exercises/concept/pacman-rules/.docs/instructions.md b/exercises/concept/pacman-rules/.docs/instructions.md index 7f16bacf5..63e87659b 100644 --- a/exercises/concept/pacman-rules/.docs/instructions.md +++ b/exercises/concept/pacman-rules/.docs/instructions.md @@ -11,7 +11,7 @@ You have four rules to translate, all related to the game states. Define the `eatsGhost` function that takes two arguments (_whether Pac-Man has a power pellet active_ and _Pac-Man is touching a ghost_) and returns a `Bool` value when Pac-Man is able to eat the ghost. The function should return `True` only when Pac-Man has a power pellet active and is touching a ghost. -```Haskell +```haskell eatsGhost False True -- -> False ``` @@ -21,7 +21,7 @@ eatsGhost False True Define the `scores` function that takes two arguments (_whether Pac-Man is touching a power pellet_ and _Pac-Man is touching a dot_) and returns a `Bool` value if Pac-Man scored. The function should return `True` when Pac-Man is touching a power pellet or a dot. -```Haskell +```haskell scores True True -- -> True ``` @@ -31,7 +31,7 @@ scores True True Define the `loses` function that takes two arguments (_whether Pac-Man has a power pellet active_ and _Pac-Man is touching a ghost_) and returns a `Bool` value if Pac-Man loses. The function should return `True` when Pac-Man is touching a ghost and does not have a power pellet active. -```Haskell +```haskell loses False True -- -> True ``` @@ -41,7 +41,7 @@ loses False True Define the `wins` function that takes three arguments (_whether Pac-Man has eaten all of the dots_, _Pac-Man has a power pellet active_, and _Pac-Man is touching a ghost_) and returns a `Bool` value if Pac-Man wins. The function should return `True` when Pac-Man has eaten all of the dots _and_ has not lost based on the arguments defined in part 3. -```Haskell +```haskell wins False True False -- -> False ``` diff --git a/exercises/concept/pacman-rules/.docs/introduction.md b/exercises/concept/pacman-rules/.docs/introduction.md index 4c1eab40f..1349c6f70 100644 --- a/exercises/concept/pacman-rules/.docs/introduction.md +++ b/exercises/concept/pacman-rules/.docs/introduction.md @@ -1,8 +1,84 @@ -# Introduction +# Bools -Booleans in Haskell are represented by the `Bool` type, which values can be either `True` or `False`. +Haskell has a type known as [`Bool`][bools]. +It is an enumeration of `True` and `False`. -Haskell supports three boolean operators: `not` (NOT), `&&` (AND), and `||` (OR). +## Logical operators -The three boolean operators each have a different operator precedence, which causes them to be evaluated in this order: `not` first, `&&` second, and finally `||`. -If you want to override these rules, you can enclose a boolean expression in parentheses (`()`), as the parentheses have an even higher operator precedence. +Haskell has three logical operators (`not`, `||`, `&&`), which combine Bools and make expressions that produce different values. + +### And(`&&`) + +The [_and_ operator][and] in Haskell is represented by `&&` and returns `True` if both values are `True`; otherwise, it returns `False`. +When using the _and_ operator, one Bool is placed on the right side of the `&&` and another on the left side. + +```haskell +True && True +-- -> True + +True && False +-- -> False +``` + +### Or(`||`) + +The [_or_ operator][or] in Haskell is represented by `||` and returns `True` if **at least one** of the values given is `True`. +If both of the values are `False`, then it returns `False`. +When using the _or_ operator, one Bool should be placed on the right side of the `||` and another on the left. + +```haskell +True || True +-- -> True + +True || False +-- -> True + +False || False +-- -> False +``` + +### Not(`not`) + +The _not_ operator in Haskell is represented by `not` and returns `True` if the given Bool is `False` and returns `False` if `True` is provided. +When using the _not_ operator, one Bool should be placed after the operator (`not`). + +```haskell +not True +-- -> False + +not False +-- -> True +``` + +## Using parentheses(`()`) + +When working with booleans, you can use parentheses to decide which Bools to evaluate first. +The result can differ depending on how the parentheses are used. +In Haskell, what is in parentheses is evaluated first. + +```haskell +True && False && False || True +-- -> True + +True && False && (False || True) +-- -> False +``` + +Since what is in parentheses is evaluated first, the _not_ operator will apply to the expression inside parentheses in the following example. + +```haskell +not True && False +-- -> False + +not (True && False) +-- -> True +``` + +~~~~exercism/note +You should only use parentheses when they affect the result; otherwise, they should be omitted. +~~~~ + +[bools]: https://hackage.haskell.org/package/base/docs/Data-Bool.html +[and]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-38--38- +[or]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:-124--124- +[not]: https://hackage.haskell.org/package/base/docs/Prelude.html#v:not diff --git a/exercises/concept/pacman-rules/.meta/config.json b/exercises/concept/pacman-rules/.meta/config.json index 656a583e7..c6280c0c0 100644 --- a/exercises/concept/pacman-rules/.meta/config.json +++ b/exercises/concept/pacman-rules/.meta/config.json @@ -2,6 +2,9 @@ "authors": [ "pwadsworth" ], + "contributors": + ["meatball133"] + , "files": { "solution": [ "src/PacmanRules.hs", From 390f26bbed6b628012fa7ece8f67e774c3001feb Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Sat, 16 May 2026 11:07:33 -0700 Subject: [PATCH 10/19] Use `Test.Hspec.Runner` to run concept tests, matching what is done for practice tests (#1297) [no important files changed] --- exercises/concept/guessing-game/test/Tests.hs | 8 ++++++-- exercises/concept/lucians-luscious-lasagna/test/Tests.hs | 8 ++++++-- exercises/concept/pacman-rules/test/Tests.hs | 8 ++++++-- exercises/concept/temperature/test/Tests.hs | 8 ++++++-- exercises/concept/valentines-day/test/Tests.hs | 8 ++++++-- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/exercises/concept/guessing-game/test/Tests.hs b/exercises/concept/guessing-game/test/Tests.hs index 16cbf9a98..1e040724e 100644 --- a/exercises/concept/guessing-game/test/Tests.hs +++ b/exercises/concept/guessing-game/test/Tests.hs @@ -1,8 +1,12 @@ import GuessingGame (reply) -import Test.Hspec (describe, hspec, it, shouldBe) +import Test.Hspec (Spec, describe, it, shouldBe) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) main :: IO () -main = hspec $ +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = do describe "reply" $ do it "1 should be 'Too low'" $ reply 1 `shouldBe` "Too low" diff --git a/exercises/concept/lucians-luscious-lasagna/test/Tests.hs b/exercises/concept/lucians-luscious-lasagna/test/Tests.hs index fc7448f3a..250f5316c 100644 --- a/exercises/concept/lucians-luscious-lasagna/test/Tests.hs +++ b/exercises/concept/lucians-luscious-lasagna/test/Tests.hs @@ -1,8 +1,12 @@ -import Test.Hspec (it, shouldBe, hspec) +import Test.Hspec (Spec, it, shouldBe) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) import LuciansLusciousLasagna (elapsedTimeInMinutes, expectedMinutesInOven, preparationTimeInMinutes) main :: IO () -main = hspec $ do +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = do it "expectedMinutesInOven" $ do expectedMinutesInOven `shouldBe` 40 diff --git a/exercises/concept/pacman-rules/test/Tests.hs b/exercises/concept/pacman-rules/test/Tests.hs index c2e2e25ec..9d3fa9dd9 100644 --- a/exercises/concept/pacman-rules/test/Tests.hs +++ b/exercises/concept/pacman-rules/test/Tests.hs @@ -1,8 +1,12 @@ import PacmanRules (eatsGhost, loses, scores, wins) -import Test.Hspec (describe, hspec, it, shouldBe) +import Test.Hspec (Spec, describe, it, shouldBe) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) main :: IO () -main = hspec $ do +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = do describe "eatsGhost" $ do it "ghost eaten when touched while powered" $ do eatsGhost True True `shouldBe` True diff --git a/exercises/concept/temperature/test/Tests.hs b/exercises/concept/temperature/test/Tests.hs index b8cb26c21..477bf5b34 100644 --- a/exercises/concept/temperature/test/Tests.hs +++ b/exercises/concept/temperature/test/Tests.hs @@ -1,7 +1,8 @@ {-# LANGUAGE RecordWildCards #-} import Data.Foldable (for_) -import Test.Hspec (describe, hspec, it, shouldBe) +import Test.Hspec (Spec, describe, it, shouldBe) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) import Temperature (tempToC, tempToF) @@ -49,7 +50,10 @@ toCCases = [ Case { description = "negative Fahrenheit to negative Celsius" ] main :: IO () -main = hspec $ do +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = do describe "tempToF" $ do for_ toFCases $ \Case {..} -> it description $ tempToF celsius `shouldBe` fahrenheit diff --git a/exercises/concept/valentines-day/test/Tests.hs b/exercises/concept/valentines-day/test/Tests.hs index ddb908ff0..de16327a1 100644 --- a/exercises/concept/valentines-day/test/Tests.hs +++ b/exercises/concept/valentines-day/test/Tests.hs @@ -1,8 +1,12 @@ -import Test.Hspec (describe, hspec, it) +import Test.Hspec (Spec, describe, it) +import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) import ValentinesDay (Activity (..), Approval (..), Cuisine (..), Genre (..), rateActivity) main :: IO () -main = hspec $ +main = hspecWith defaultConfig {configFailFast = True} specs + +specs :: Spec +specs = do describe "ValentinesDay" $ do it "chill rated no" $ case rateActivity Chill of From c61824ba2125974f7c2cb6e2a2247c319df219c4 Mon Sep 17 00:00:00 2001 From: tofische Date: Sun, 21 Jun 2026 17:21:47 +0200 Subject: [PATCH 11/19] Add grep to config.json --- config.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config.json b/config.json index 96839ecbe..64577d239 100644 --- a/config.json +++ b/config.json @@ -1386,6 +1386,17 @@ "topics": [ "strings" ] + }, + { + "slug": "grep", + "name": "Grep", + "uuid": "d6535287-ddb0-493d-85ee-9923cdc59955", + "practices": [], + "prerequisites": [], + "difficulty": 7, + "topics": [ + "io_monad" + ] } ], "foregone": [ From 3d8c9a3e5a145b47c1a567dcebea161c7746ad8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 11:59:09 +0200 Subject: [PATCH 12/19] build(deps): bump actions/cache from 4.3.0 to 5.0.5 (#1280) Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0057852bfaa89a56745cba8c7296529d2fc39830...27d5ce7f107fe9357f9df03efb73ab90386fccae) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.1.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tomas Fischer From 2688cb85ba56b964f71fae5e1908482e735cf619 Mon Sep 17 00:00:00 2001 From: tofische Date: Sun, 21 Jun 2026 20:15:03 +0200 Subject: [PATCH 13/19] Satisfy hlint --- .../examples/success-standard/src/Grep.hs | 10 ++-- exercises/practice/grep/test/Tests.hs | 56 +++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs b/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs index 1cc0214d8..ff10cdf85 100644 --- a/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs +++ b/exercises/practice/grep/.meta/examples/success-standard/src/Grep.hs @@ -9,20 +9,20 @@ data Flag = N | L | I | V | X deriving (Eq, Ord) type Flags = [Flag] grep :: String -> Flags -> [FilePath] -> IO [String] -grep pattern flags files = do +grep string flags files = do content <- mapM readFile' files let input = zip files (map lines content) - return $ grep' pattern flags input + return $ grep' string flags input grep' :: String -> Flags -> [(String, [String])] -> [String] -grep' pattern flags files = concatMap grepInFile files +grep' string flags files = concatMap grepInFile files where flagN = N `elem` flags flagL = L `elem` flags flagI = I `elem` flags flagV = V `elem` flags flagX = X `elem` flags - pattern' = if flagI then map toLower pattern else pattern + string' = if flagI then map toLower string else string multiple = length files > 1 grepInFile (fileName, content) = if flagL && not (null matchInFile) then [fileName] else matchInFile where @@ -31,7 +31,7 @@ grep' pattern flags files = concatMap grepInFile files grepInLine (line, lineNum) = [res | if flagV then not isMatchInLine else isMatchInLine] where line' = if flagI then map toLower line else line - isMatchInLine = if flagX then pattern' == line' else pattern' `isInfixOf` line' + isMatchInLine = if flagX then string' == line' else string' `isInfixOf` line' res = (if multiple then fileName <> ":" else "") <> (if flagN then show lineNum <> ":" else "") <> diff --git a/exercises/practice/grep/test/Tests.hs b/exercises/practice/grep/test/Tests.hs index d5f93b3d1..54a101ddc 100644 --- a/exercises/practice/grep/test/Tests.hs +++ b/exercises/practice/grep/test/Tests.hs @@ -16,7 +16,7 @@ specs = describe "grep" $ for_ cases test test testCase@Case{..} = around (withFiles files) $ it description $ - \files -> grep pattern flags files >>= (\content -> content `shouldBe` expected) + \files -> grep string flags files >>= (\content -> content `shouldBe` expected) withFiles files runTest = do sys <- getTemporaryDirectory @@ -26,7 +26,7 @@ withFiles files runTest = do for_ files $ \file -> removeFile (fst file) data Case = Case { description :: String - , pattern :: String + , string :: String , flags :: [Flag] , files :: [(String, [String])] , expected :: [String] @@ -35,43 +35,43 @@ data Case = Case { description :: String cases :: [Case] cases = [ Case { description = "One file, one match, no flags" - , pattern = "Agamemnon" + , string = "Agamemnon" , flags = [] , files = [iliad] , expected = ["Of Atreus, Agamemnon, King of men."] } , Case { description = "One file, one match, print line numbers flag" - , pattern = "Forbidden" + , string = "Forbidden" , flags = [N] , files = [paradiseLost] , expected = ["2:Of that Forbidden Tree, whose mortal tast"] } , Case { description = "One file, one match, case-insensitive flag" - , pattern = "FORBIDDEN" + , string = "FORBIDDEN" , flags = [I] , files = [paradiseLost] , expected = ["Of that Forbidden Tree, whose mortal tast"] } , Case { description = "One file, one match, print file names flag" - , pattern = "Forbidden" + , string = "Forbidden" , flags = [L] , files = [paradiseLost] , expected = ["paradise-lost.txt"] } , Case { description = "One file, one match, match entire lines flag" - , pattern = "With loss of Eden, till one greater Man" + , string = "With loss of Eden, till one greater Man" , flags = [X] , files = [paradiseLost] , expected = ["With loss of Eden, till one greater Man"] } , Case { description = "One file, one match, multiple flags" - , pattern = "OF ATREUS, Agamemnon, KIng of MEN." + , string = "OF ATREUS, Agamemnon, KIng of MEN." , flags = [N, I, X] , files = [iliad] , expected = ["9:Of Atreus, Agamemnon, King of men."] } , Case { description = "One file, several matches, no flags" - , pattern = "may" + , string = "may" , flags = [] , files = [midsummerNight] , expected = [ @@ -81,7 +81,7 @@ cases = ] } , Case { description = "One file, several matches, print line numbers flag" - , pattern = "may" + , string = "may" , flags = [N] , files = [midsummerNight] , expected = [ @@ -91,13 +91,13 @@ cases = ] } , Case { description = "One file, several matches, match entire lines flag" - , pattern = "may" + , string = "may" , flags = [X] , files = [midsummerNight] , expected = [] } , Case { description = "One file, several matches, case-insensitive flag" - , pattern = "ACHILLES" + , string = "ACHILLES" , flags = [I] , files = [iliad] , expected = [ @@ -106,7 +106,7 @@ cases = ] } , Case { description = "One file, several matches, inverted flag" - , pattern = "Of" + , string = "Of" , flags = [V] , files = [paradiseLost] , expected = [ @@ -118,19 +118,19 @@ cases = ] } , Case { description = "One file, no matches, various flags" - , pattern = "Gandalf" + , string = "Gandalf" , flags = [N, L, X, I] , files = [iliad] , expected = [] } , Case { description = "One file, one match, file flag takes precedence over line flag" - , pattern = "ten" + , string = "ten" , flags = [N, L] , files = [iliad] , expected = ["iliad.txt"] } , Case { description = "One file, several matches, inverted and match entire lines flags" - , pattern = "Illustrious into Ades premature," + , string = "Illustrious into Ades premature," , flags = [X, V] , files = [iliad] , expected = [ @@ -145,13 +145,13 @@ cases = ] } , Case { description = "Multiple files, one match, no flags" - , pattern = "Agamemnon" + , string = "Agamemnon" , flags = [] , files = [iliad, midsummerNight, paradiseLost] , expected = ["iliad.txt:Of Atreus, Agamemnon, King of men."] } , Case { description = "Multiple files, several matches, no flags" - , pattern = "may" + , string = "may" , flags = [] , files = [iliad, midsummerNight, paradiseLost] , expected = [ @@ -161,7 +161,7 @@ cases = ] } , Case { description = "Multiple files, several matches, print line numbers flag" - , pattern = "that" + , string = "that" , flags = [N] , files = [iliad, midsummerNight, paradiseLost] , expected = [ @@ -172,13 +172,13 @@ cases = ] } , Case { description = "Multiple files, one match, print file names flag" - , pattern = "who" + , string = "who" , flags = [L] , files = [iliad, midsummerNight, paradiseLost] , expected = ["iliad.txt", "paradise-lost.txt"] } , Case { description = "Multiple files, several matches, case-insensitive flag" - , pattern = "TO" + , string = "TO" , flags = [I] , files = [iliad, midsummerNight, paradiseLost] , expected = [ @@ -195,7 +195,7 @@ cases = ] } , Case { description = "Multiple files, several matches, inverted flag" - , pattern = "a" + , string = "a" , flags = [V] , files = [iliad, midsummerNight, paradiseLost] , expected = [ @@ -205,31 +205,31 @@ cases = ] } , Case { description = "Multiple files, one match, match entire lines flag" - , pattern = "But I beseech your grace that I may know" + , string = "But I beseech your grace that I may know" , flags = [X] , files = [iliad, midsummerNight, paradiseLost] , expected = ["midsummer-night.txt:But I beseech your grace that I may know"] } , Case { description = "Multiple files, one match, multiple flags" - , pattern = "WITH LOSS OF EDEN, TILL ONE GREATER MAN" + , string = "WITH LOSS OF EDEN, TILL ONE GREATER MAN" , flags = [N, I, X] , files = [iliad, midsummerNight, paradiseLost] , expected = ["paradise-lost.txt:4:With loss of Eden, till one greater Man"] } , Case { description = "Multiple files, no matches, various flags" - , pattern = "Frodo" + , string = "Frodo" , flags = [N, L, X, I] , files = [iliad, midsummerNight, paradiseLost] , expected = [] } , Case { description = "Multiple files, several matches, file flag takes precedence over line number flag" - , pattern = "who" + , string = "who" , flags = [N, L] , files = [iliad, midsummerNight, paradiseLost] , expected = ["iliad.txt", "paradise-lost.txt"] } , Case { description = "Multiple files, several matches, inverted and match entire lines flags" - , pattern = "Illustrious into Ades premature," + , string = "Illustrious into Ades premature," , flags = [X, V] , files = [iliad, midsummerNight, paradiseLost] , expected = [ @@ -292,4 +292,4 @@ paradiseLost = "Sing Heav'nly Muse, that on the secret top", "Of Oreb, or of Sinai, didst inspire", "That Shepherd, who first taught the chosen Seed" - ]) \ No newline at end of file + ]) From 7e17db3609957e8a3503937e775edc27edb9b02f Mon Sep 17 00:00:00 2001 From: keiravillekode Date: Thu, 18 Jun 2026 19:31:27 +1000 Subject: [PATCH 14/19] verify-exercises-in-docker: avoid cleanup failure (#1303) --- bin/verify-exercises-in-docker | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/verify-exercises-in-docker b/bin/verify-exercises-in-docker index a157a3d1c..dccc64e14 100755 --- a/bin/verify-exercises-in-docker +++ b/bin/verify-exercises-in-docker @@ -42,6 +42,7 @@ run_tests() { --rm \ --network none \ --mount type=bind,src="${PWD}",dst=/solution \ + --mount type=volume,dst=/solution/.stack-work \ --mount type=bind,src="${PWD}",dst=/output \ --mount type=tmpfs,dst=/tmp \ "${image}" "${slug}" /solution /output From 1b4ad32a9b058dc7aa989f78757b0659ea975d4f Mon Sep 17 00:00:00 2001 From: Isaac Good Date: Thu, 18 Jun 2026 11:27:52 -0700 Subject: [PATCH 15/19] Bump resolver to `lts-22.44` to match the test runner (#1304) * Bump resolver to `lts-22.44` to match the test runner * Update examples to pass testing [no important files changed] --- exercises/concept/guessing-game/stack.yaml | 2 +- exercises/concept/lucians-luscious-lasagna/stack.yaml | 2 +- exercises/concept/pacman-rules/stack.yaml | 2 +- exercises/concept/temperature/stack.yaml | 2 +- exercises/concept/valentines-day/stack.yaml | 2 +- exercises/practice/accumulate/stack.yaml | 2 +- exercises/practice/acronym/stack.yaml | 2 +- exercises/practice/affine-cipher/stack.yaml | 2 +- exercises/practice/all-your-base/stack.yaml | 2 +- exercises/practice/allergies/stack.yaml | 2 +- exercises/practice/alphametics/stack.yaml | 2 +- exercises/practice/anagram/stack.yaml | 2 +- exercises/practice/armstrong-numbers/stack.yaml | 2 +- exercises/practice/atbash-cipher/stack.yaml | 2 +- exercises/practice/bank-account/stack.yaml | 2 +- exercises/practice/beer-song/stack.yaml | 2 +- exercises/practice/binary-search-tree/stack.yaml | 2 +- exercises/practice/binary-search/stack.yaml | 2 +- exercises/practice/binary/stack.yaml | 2 +- exercises/practice/bob/stack.yaml | 2 +- exercises/practice/book-store/stack.yaml | 2 +- exercises/practice/bowling/stack.yaml | 2 +- exercises/practice/change/stack.yaml | 2 +- exercises/practice/clock/stack.yaml | 2 +- exercises/practice/collatz-conjecture/stack.yaml | 2 +- exercises/practice/complex-numbers/stack.yaml | 2 +- exercises/practice/connect/stack.yaml | 2 +- exercises/practice/crypto-square/stack.yaml | 2 +- exercises/practice/custom-set/stack.yaml | 2 +- exercises/practice/darts/stack.yaml | 2 +- exercises/practice/diamond/stack.yaml | 2 +- exercises/practice/difference-of-squares/stack.yaml | 2 +- exercises/practice/dnd-character/stack.yaml | 2 +- exercises/practice/dominoes/stack.yaml | 2 +- exercises/practice/etl/stack.yaml | 2 +- exercises/practice/flower-field/stack.yaml | 2 +- exercises/practice/food-chain/stack.yaml | 2 +- exercises/practice/forth/stack.yaml | 2 +- exercises/practice/game-of-life/stack.yaml | 2 +- exercises/practice/gigasecond/stack.yaml | 2 +- exercises/practice/go-counting/stack.yaml | 2 +- exercises/practice/grade-school/stack.yaml | 2 +- exercises/practice/grains/stack.yaml | 2 +- exercises/practice/hamming/stack.yaml | 2 +- exercises/practice/hello-world/stack.yaml | 2 +- exercises/practice/hexadecimal/stack.yaml | 2 +- exercises/practice/house/stack.yaml | 2 +- exercises/practice/isbn-verifier/stack.yaml | 2 +- exercises/practice/isogram/stack.yaml | 2 +- exercises/practice/kindergarten-garden/stack.yaml | 2 +- exercises/practice/knapsack/stack.yaml | 2 +- exercises/practice/largest-series-product/stack.yaml | 2 +- exercises/practice/leap/stack.yaml | 2 +- exercises/practice/lens-person/stack.yaml | 2 +- exercises/practice/linked-list/stack.yaml | 2 +- exercises/practice/list-ops/stack.yaml | 2 +- exercises/practice/luhn/stack.yaml | 2 +- exercises/practice/matching-brackets/stack.yaml | 2 +- exercises/practice/matrix/stack.yaml | 2 +- exercises/practice/meetup/stack.yaml | 2 +- exercises/practice/minesweeper/stack.yaml | 2 +- exercises/practice/nth-prime/stack.yaml | 2 +- exercises/practice/nucleotide-count/stack.yaml | 2 +- exercises/practice/ocr-numbers/stack.yaml | 2 +- exercises/practice/octal/stack.yaml | 2 +- exercises/practice/palindrome-products/stack.yaml | 2 +- exercises/practice/pangram/stack.yaml | 2 +- exercises/practice/parallel-letter-frequency/stack.yaml | 2 +- exercises/practice/pascals-triangle/stack.yaml | 2 +- exercises/practice/perfect-numbers/stack.yaml | 2 +- exercises/practice/phone-number/stack.yaml | 2 +- exercises/practice/pig-latin/stack.yaml | 2 +- exercises/practice/poker/stack.yaml | 2 +- exercises/practice/pov/stack.yaml | 2 +- exercises/practice/prime-factors/stack.yaml | 2 +- exercises/practice/protein-translation/stack.yaml | 2 +- exercises/practice/proverb/stack.yaml | 2 +- exercises/practice/pythagorean-triplet/stack.yaml | 2 +- exercises/practice/queen-attack/stack.yaml | 2 +- exercises/practice/rail-fence-cipher/stack.yaml | 2 +- exercises/practice/raindrops/stack.yaml | 2 +- exercises/practice/rational-numbers/stack.yaml | 2 +- exercises/practice/resistor-color-duo/stack.yaml | 2 +- exercises/practice/resistor-color-trio/stack.yaml | 2 +- exercises/practice/reverse-string/stack.yaml | 2 +- exercises/practice/rna-transcription/stack.yaml | 2 +- exercises/practice/robot-name/stack.yaml | 2 +- exercises/practice/robot-simulator/stack.yaml | 2 +- exercises/practice/roman-numerals/stack.yaml | 2 +- exercises/practice/rotational-cipher/stack.yaml | 2 +- exercises/practice/run-length-encoding/stack.yaml | 2 +- exercises/practice/saddle-points/stack.yaml | 2 +- exercises/practice/satellite/stack.yaml | 2 +- exercises/practice/say/stack.yaml | 2 +- exercises/practice/scrabble-score/stack.yaml | 2 +- exercises/practice/secret-handshake/stack.yaml | 2 +- .../series/.meta/examples/success-byteseqs/src/Series.hs | 1 - exercises/practice/series/stack.yaml | 2 +- exercises/practice/sgf-parsing/stack.yaml | 2 +- exercises/practice/sieve/stack.yaml | 2 +- exercises/practice/simple-cipher/stack.yaml | 2 +- exercises/practice/simple-linked-list/stack.yaml | 2 +- exercises/practice/space-age/stack.yaml | 2 +- exercises/practice/spiral-matrix/stack.yaml | 2 +- exercises/practice/state-of-tic-tac-toe/stack.yaml | 2 +- exercises/practice/strain/stack.yaml | 2 +- exercises/practice/sublist/stack.yaml | 2 +- exercises/practice/sum-of-multiples/stack.yaml | 2 +- exercises/practice/transpose/stack.yaml | 2 +- exercises/practice/triangle/stack.yaml | 2 +- exercises/practice/trinary/stack.yaml | 2 +- exercises/practice/twelve-days/stack.yaml | 2 +- exercises/practice/two-bucket/stack.yaml | 2 +- exercises/practice/word-count/stack.yaml | 2 +- exercises/practice/word-search/stack.yaml | 2 +- exercises/practice/wordy/stack.yaml | 2 +- exercises/practice/yacht/stack.yaml | 2 +- exercises/practice/zebra-puzzle/stack.yaml | 2 +- exercises/practice/zipper/stack.yaml | 2 +- 119 files changed, 118 insertions(+), 119 deletions(-) diff --git a/exercises/concept/guessing-game/stack.yaml b/exercises/concept/guessing-game/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/concept/guessing-game/stack.yaml +++ b/exercises/concept/guessing-game/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/concept/lucians-luscious-lasagna/stack.yaml b/exercises/concept/lucians-luscious-lasagna/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/concept/lucians-luscious-lasagna/stack.yaml +++ b/exercises/concept/lucians-luscious-lasagna/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/concept/pacman-rules/stack.yaml b/exercises/concept/pacman-rules/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/concept/pacman-rules/stack.yaml +++ b/exercises/concept/pacman-rules/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/concept/temperature/stack.yaml b/exercises/concept/temperature/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/concept/temperature/stack.yaml +++ b/exercises/concept/temperature/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/concept/valentines-day/stack.yaml b/exercises/concept/valentines-day/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/concept/valentines-day/stack.yaml +++ b/exercises/concept/valentines-day/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/accumulate/stack.yaml b/exercises/practice/accumulate/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/accumulate/stack.yaml +++ b/exercises/practice/accumulate/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/acronym/stack.yaml b/exercises/practice/acronym/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/acronym/stack.yaml +++ b/exercises/practice/acronym/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/affine-cipher/stack.yaml b/exercises/practice/affine-cipher/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/affine-cipher/stack.yaml +++ b/exercises/practice/affine-cipher/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/all-your-base/stack.yaml b/exercises/practice/all-your-base/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/all-your-base/stack.yaml +++ b/exercises/practice/all-your-base/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/allergies/stack.yaml b/exercises/practice/allergies/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/allergies/stack.yaml +++ b/exercises/practice/allergies/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/alphametics/stack.yaml b/exercises/practice/alphametics/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/alphametics/stack.yaml +++ b/exercises/practice/alphametics/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/anagram/stack.yaml b/exercises/practice/anagram/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/anagram/stack.yaml +++ b/exercises/practice/anagram/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/armstrong-numbers/stack.yaml b/exercises/practice/armstrong-numbers/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/armstrong-numbers/stack.yaml +++ b/exercises/practice/armstrong-numbers/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/atbash-cipher/stack.yaml b/exercises/practice/atbash-cipher/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/atbash-cipher/stack.yaml +++ b/exercises/practice/atbash-cipher/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/bank-account/stack.yaml b/exercises/practice/bank-account/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/bank-account/stack.yaml +++ b/exercises/practice/bank-account/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/beer-song/stack.yaml b/exercises/practice/beer-song/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/beer-song/stack.yaml +++ b/exercises/practice/beer-song/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/binary-search-tree/stack.yaml b/exercises/practice/binary-search-tree/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/binary-search-tree/stack.yaml +++ b/exercises/practice/binary-search-tree/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/binary-search/stack.yaml b/exercises/practice/binary-search/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/binary-search/stack.yaml +++ b/exercises/practice/binary-search/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/binary/stack.yaml b/exercises/practice/binary/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/binary/stack.yaml +++ b/exercises/practice/binary/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/bob/stack.yaml b/exercises/practice/bob/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/bob/stack.yaml +++ b/exercises/practice/bob/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/book-store/stack.yaml b/exercises/practice/book-store/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/book-store/stack.yaml +++ b/exercises/practice/book-store/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/bowling/stack.yaml b/exercises/practice/bowling/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/bowling/stack.yaml +++ b/exercises/practice/bowling/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/change/stack.yaml b/exercises/practice/change/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/change/stack.yaml +++ b/exercises/practice/change/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/clock/stack.yaml b/exercises/practice/clock/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/clock/stack.yaml +++ b/exercises/practice/clock/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/collatz-conjecture/stack.yaml b/exercises/practice/collatz-conjecture/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/collatz-conjecture/stack.yaml +++ b/exercises/practice/collatz-conjecture/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/complex-numbers/stack.yaml b/exercises/practice/complex-numbers/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/complex-numbers/stack.yaml +++ b/exercises/practice/complex-numbers/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/connect/stack.yaml b/exercises/practice/connect/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/connect/stack.yaml +++ b/exercises/practice/connect/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/crypto-square/stack.yaml b/exercises/practice/crypto-square/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/crypto-square/stack.yaml +++ b/exercises/practice/crypto-square/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/custom-set/stack.yaml b/exercises/practice/custom-set/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/custom-set/stack.yaml +++ b/exercises/practice/custom-set/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/darts/stack.yaml b/exercises/practice/darts/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/darts/stack.yaml +++ b/exercises/practice/darts/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/diamond/stack.yaml b/exercises/practice/diamond/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/diamond/stack.yaml +++ b/exercises/practice/diamond/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/difference-of-squares/stack.yaml b/exercises/practice/difference-of-squares/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/difference-of-squares/stack.yaml +++ b/exercises/practice/difference-of-squares/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/dnd-character/stack.yaml b/exercises/practice/dnd-character/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/dnd-character/stack.yaml +++ b/exercises/practice/dnd-character/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/dominoes/stack.yaml b/exercises/practice/dominoes/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/dominoes/stack.yaml +++ b/exercises/practice/dominoes/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/etl/stack.yaml b/exercises/practice/etl/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/etl/stack.yaml +++ b/exercises/practice/etl/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/flower-field/stack.yaml b/exercises/practice/flower-field/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/flower-field/stack.yaml +++ b/exercises/practice/flower-field/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/food-chain/stack.yaml b/exercises/practice/food-chain/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/food-chain/stack.yaml +++ b/exercises/practice/food-chain/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/forth/stack.yaml b/exercises/practice/forth/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/forth/stack.yaml +++ b/exercises/practice/forth/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/game-of-life/stack.yaml b/exercises/practice/game-of-life/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/game-of-life/stack.yaml +++ b/exercises/practice/game-of-life/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/gigasecond/stack.yaml b/exercises/practice/gigasecond/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/gigasecond/stack.yaml +++ b/exercises/practice/gigasecond/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/go-counting/stack.yaml b/exercises/practice/go-counting/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/go-counting/stack.yaml +++ b/exercises/practice/go-counting/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/grade-school/stack.yaml b/exercises/practice/grade-school/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/grade-school/stack.yaml +++ b/exercises/practice/grade-school/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/grains/stack.yaml b/exercises/practice/grains/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/grains/stack.yaml +++ b/exercises/practice/grains/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/hamming/stack.yaml b/exercises/practice/hamming/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/hamming/stack.yaml +++ b/exercises/practice/hamming/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/hello-world/stack.yaml b/exercises/practice/hello-world/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/hello-world/stack.yaml +++ b/exercises/practice/hello-world/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/hexadecimal/stack.yaml b/exercises/practice/hexadecimal/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/hexadecimal/stack.yaml +++ b/exercises/practice/hexadecimal/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/house/stack.yaml b/exercises/practice/house/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/house/stack.yaml +++ b/exercises/practice/house/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/isbn-verifier/stack.yaml b/exercises/practice/isbn-verifier/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/isbn-verifier/stack.yaml +++ b/exercises/practice/isbn-verifier/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/isogram/stack.yaml b/exercises/practice/isogram/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/isogram/stack.yaml +++ b/exercises/practice/isogram/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/kindergarten-garden/stack.yaml b/exercises/practice/kindergarten-garden/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/kindergarten-garden/stack.yaml +++ b/exercises/practice/kindergarten-garden/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/knapsack/stack.yaml b/exercises/practice/knapsack/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/knapsack/stack.yaml +++ b/exercises/practice/knapsack/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/largest-series-product/stack.yaml b/exercises/practice/largest-series-product/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/largest-series-product/stack.yaml +++ b/exercises/practice/largest-series-product/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/leap/stack.yaml b/exercises/practice/leap/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/leap/stack.yaml +++ b/exercises/practice/leap/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/lens-person/stack.yaml b/exercises/practice/lens-person/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/lens-person/stack.yaml +++ b/exercises/practice/lens-person/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/linked-list/stack.yaml b/exercises/practice/linked-list/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/linked-list/stack.yaml +++ b/exercises/practice/linked-list/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/list-ops/stack.yaml b/exercises/practice/list-ops/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/list-ops/stack.yaml +++ b/exercises/practice/list-ops/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/luhn/stack.yaml b/exercises/practice/luhn/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/luhn/stack.yaml +++ b/exercises/practice/luhn/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/matching-brackets/stack.yaml b/exercises/practice/matching-brackets/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/matching-brackets/stack.yaml +++ b/exercises/practice/matching-brackets/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/matrix/stack.yaml b/exercises/practice/matrix/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/matrix/stack.yaml +++ b/exercises/practice/matrix/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/meetup/stack.yaml b/exercises/practice/meetup/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/meetup/stack.yaml +++ b/exercises/practice/meetup/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/minesweeper/stack.yaml b/exercises/practice/minesweeper/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/minesweeper/stack.yaml +++ b/exercises/practice/minesweeper/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/nth-prime/stack.yaml b/exercises/practice/nth-prime/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/nth-prime/stack.yaml +++ b/exercises/practice/nth-prime/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/nucleotide-count/stack.yaml b/exercises/practice/nucleotide-count/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/nucleotide-count/stack.yaml +++ b/exercises/practice/nucleotide-count/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/ocr-numbers/stack.yaml b/exercises/practice/ocr-numbers/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/ocr-numbers/stack.yaml +++ b/exercises/practice/ocr-numbers/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/octal/stack.yaml b/exercises/practice/octal/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/octal/stack.yaml +++ b/exercises/practice/octal/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/palindrome-products/stack.yaml b/exercises/practice/palindrome-products/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/palindrome-products/stack.yaml +++ b/exercises/practice/palindrome-products/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/pangram/stack.yaml b/exercises/practice/pangram/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/pangram/stack.yaml +++ b/exercises/practice/pangram/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/parallel-letter-frequency/stack.yaml b/exercises/practice/parallel-letter-frequency/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/parallel-letter-frequency/stack.yaml +++ b/exercises/practice/parallel-letter-frequency/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/pascals-triangle/stack.yaml b/exercises/practice/pascals-triangle/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/pascals-triangle/stack.yaml +++ b/exercises/practice/pascals-triangle/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/perfect-numbers/stack.yaml b/exercises/practice/perfect-numbers/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/perfect-numbers/stack.yaml +++ b/exercises/practice/perfect-numbers/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/phone-number/stack.yaml b/exercises/practice/phone-number/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/phone-number/stack.yaml +++ b/exercises/practice/phone-number/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/pig-latin/stack.yaml b/exercises/practice/pig-latin/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/pig-latin/stack.yaml +++ b/exercises/practice/pig-latin/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/poker/stack.yaml b/exercises/practice/poker/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/poker/stack.yaml +++ b/exercises/practice/poker/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/pov/stack.yaml b/exercises/practice/pov/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/pov/stack.yaml +++ b/exercises/practice/pov/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/prime-factors/stack.yaml b/exercises/practice/prime-factors/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/prime-factors/stack.yaml +++ b/exercises/practice/prime-factors/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/protein-translation/stack.yaml b/exercises/practice/protein-translation/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/protein-translation/stack.yaml +++ b/exercises/practice/protein-translation/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/proverb/stack.yaml b/exercises/practice/proverb/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/proverb/stack.yaml +++ b/exercises/practice/proverb/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/pythagorean-triplet/stack.yaml b/exercises/practice/pythagorean-triplet/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/pythagorean-triplet/stack.yaml +++ b/exercises/practice/pythagorean-triplet/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/queen-attack/stack.yaml b/exercises/practice/queen-attack/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/queen-attack/stack.yaml +++ b/exercises/practice/queen-attack/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/rail-fence-cipher/stack.yaml b/exercises/practice/rail-fence-cipher/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/rail-fence-cipher/stack.yaml +++ b/exercises/practice/rail-fence-cipher/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/raindrops/stack.yaml b/exercises/practice/raindrops/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/raindrops/stack.yaml +++ b/exercises/practice/raindrops/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/rational-numbers/stack.yaml b/exercises/practice/rational-numbers/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/rational-numbers/stack.yaml +++ b/exercises/practice/rational-numbers/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/resistor-color-duo/stack.yaml b/exercises/practice/resistor-color-duo/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/resistor-color-duo/stack.yaml +++ b/exercises/practice/resistor-color-duo/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/resistor-color-trio/stack.yaml b/exercises/practice/resistor-color-trio/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/resistor-color-trio/stack.yaml +++ b/exercises/practice/resistor-color-trio/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/reverse-string/stack.yaml b/exercises/practice/reverse-string/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/reverse-string/stack.yaml +++ b/exercises/practice/reverse-string/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/rna-transcription/stack.yaml b/exercises/practice/rna-transcription/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/rna-transcription/stack.yaml +++ b/exercises/practice/rna-transcription/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/robot-name/stack.yaml b/exercises/practice/robot-name/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/robot-name/stack.yaml +++ b/exercises/practice/robot-name/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/robot-simulator/stack.yaml b/exercises/practice/robot-simulator/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/robot-simulator/stack.yaml +++ b/exercises/practice/robot-simulator/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/roman-numerals/stack.yaml b/exercises/practice/roman-numerals/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/roman-numerals/stack.yaml +++ b/exercises/practice/roman-numerals/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/rotational-cipher/stack.yaml b/exercises/practice/rotational-cipher/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/rotational-cipher/stack.yaml +++ b/exercises/practice/rotational-cipher/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/run-length-encoding/stack.yaml b/exercises/practice/run-length-encoding/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/run-length-encoding/stack.yaml +++ b/exercises/practice/run-length-encoding/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/saddle-points/stack.yaml b/exercises/practice/saddle-points/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/saddle-points/stack.yaml +++ b/exercises/practice/saddle-points/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/satellite/stack.yaml b/exercises/practice/satellite/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/satellite/stack.yaml +++ b/exercises/practice/satellite/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/say/stack.yaml b/exercises/practice/say/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/say/stack.yaml +++ b/exercises/practice/say/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/scrabble-score/stack.yaml b/exercises/practice/scrabble-score/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/scrabble-score/stack.yaml +++ b/exercises/practice/scrabble-score/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/secret-handshake/stack.yaml b/exercises/practice/secret-handshake/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/secret-handshake/stack.yaml +++ b/exercises/practice/secret-handshake/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/series/.meta/examples/success-byteseqs/src/Series.hs b/exercises/practice/series/.meta/examples/success-byteseqs/src/Series.hs index 1634fbdce..508fc5f3c 100644 --- a/exercises/practice/series/.meta/examples/success-byteseqs/src/Series.hs +++ b/exercises/practice/series/.meta/examples/success-byteseqs/src/Series.hs @@ -1,6 +1,5 @@ module Series (slices) where -import Control.Applicative (liftA2) import Control.Monad (guard) import Data.ByteString.Char8 (ByteString, foldr, length, tails, take) import Data.Function (on) diff --git a/exercises/practice/series/stack.yaml b/exercises/practice/series/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/series/stack.yaml +++ b/exercises/practice/series/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/sgf-parsing/stack.yaml b/exercises/practice/sgf-parsing/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/sgf-parsing/stack.yaml +++ b/exercises/practice/sgf-parsing/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/sieve/stack.yaml b/exercises/practice/sieve/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/sieve/stack.yaml +++ b/exercises/practice/sieve/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/simple-cipher/stack.yaml b/exercises/practice/simple-cipher/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/simple-cipher/stack.yaml +++ b/exercises/practice/simple-cipher/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/simple-linked-list/stack.yaml b/exercises/practice/simple-linked-list/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/simple-linked-list/stack.yaml +++ b/exercises/practice/simple-linked-list/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/space-age/stack.yaml b/exercises/practice/space-age/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/space-age/stack.yaml +++ b/exercises/practice/space-age/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/spiral-matrix/stack.yaml b/exercises/practice/spiral-matrix/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/spiral-matrix/stack.yaml +++ b/exercises/practice/spiral-matrix/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/state-of-tic-tac-toe/stack.yaml b/exercises/practice/state-of-tic-tac-toe/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/state-of-tic-tac-toe/stack.yaml +++ b/exercises/practice/state-of-tic-tac-toe/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/strain/stack.yaml b/exercises/practice/strain/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/strain/stack.yaml +++ b/exercises/practice/strain/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/sublist/stack.yaml b/exercises/practice/sublist/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/sublist/stack.yaml +++ b/exercises/practice/sublist/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/sum-of-multiples/stack.yaml b/exercises/practice/sum-of-multiples/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/sum-of-multiples/stack.yaml +++ b/exercises/practice/sum-of-multiples/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/transpose/stack.yaml b/exercises/practice/transpose/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/transpose/stack.yaml +++ b/exercises/practice/transpose/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/triangle/stack.yaml b/exercises/practice/triangle/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/triangle/stack.yaml +++ b/exercises/practice/triangle/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/trinary/stack.yaml b/exercises/practice/trinary/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/trinary/stack.yaml +++ b/exercises/practice/trinary/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/twelve-days/stack.yaml b/exercises/practice/twelve-days/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/twelve-days/stack.yaml +++ b/exercises/practice/twelve-days/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/two-bucket/stack.yaml b/exercises/practice/two-bucket/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/two-bucket/stack.yaml +++ b/exercises/practice/two-bucket/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/word-count/stack.yaml b/exercises/practice/word-count/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/word-count/stack.yaml +++ b/exercises/practice/word-count/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/word-search/stack.yaml b/exercises/practice/word-search/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/word-search/stack.yaml +++ b/exercises/practice/word-search/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/wordy/stack.yaml b/exercises/practice/wordy/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/wordy/stack.yaml +++ b/exercises/practice/wordy/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/yacht/stack.yaml b/exercises/practice/yacht/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/yacht/stack.yaml +++ b/exercises/practice/yacht/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/zebra-puzzle/stack.yaml b/exercises/practice/zebra-puzzle/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/zebra-puzzle/stack.yaml +++ b/exercises/practice/zebra-puzzle/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 diff --git a/exercises/practice/zipper/stack.yaml b/exercises/practice/zipper/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/zipper/stack.yaml +++ b/exercises/practice/zipper/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 From 7b97a34ae847f61b4fc9e28c144b3f16e25db28c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 11:59:09 +0200 Subject: [PATCH 16/19] build(deps): bump actions/cache from 4.3.0 to 5.0.5 (#1280) Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0057852bfaa89a56745cba8c7296529d2fc39830...27d5ce7f107fe9357f9df03efb73ab90386fccae) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.1.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tomas Fischer From a94309fe71068cdd0fba3e92cc7dbca77b722720 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 11:59:09 +0200 Subject: [PATCH 17/19] build(deps): bump actions/cache from 4.3.0 to 5.0.5 (#1280) Bumps [actions/cache](https://github.com/actions/cache) from 4.3.0 to 5.0.5. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/0057852bfaa89a56745cba8c7296529d2fc39830...27d5ce7f107fe9357f9df03efb73ab90386fccae) --- updated-dependencies: - dependency-name: actions/cache dependency-version: 4.1.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Tomas Fischer From 6290bd3faf4744d5d78b7277935b4583abd5c710 Mon Sep 17 00:00:00 2001 From: tofische Date: Mon, 22 Jun 2026 21:16:55 +0200 Subject: [PATCH 18/19] Update resolver --- exercises/practice/grep/stack.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/grep/stack.yaml b/exercises/practice/grep/stack.yaml index 115878212..1fe2deb93 100644 --- a/exercises/practice/grep/stack.yaml +++ b/exercises/practice/grep/stack.yaml @@ -1 +1 @@ -resolver: lts-20.18 +resolver: lts-22.44 From 81378df8ebe8cf947823e5b986e4f617c66fe1ad Mon Sep 17 00:00:00 2001 From: tofische Date: Mon, 22 Jun 2026 21:47:28 +0200 Subject: [PATCH 19/19] Satisfy hlint --- exercises/practice/grep/src/Grep.hs | 2 +- exercises/practice/grep/test/Tests.hs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/exercises/practice/grep/src/Grep.hs b/exercises/practice/grep/src/Grep.hs index a2cf7dda3..c035e95e2 100644 --- a/exercises/practice/grep/src/Grep.hs +++ b/exercises/practice/grep/src/Grep.hs @@ -5,4 +5,4 @@ data Flag = N | L | I | V | X deriving (Eq, Ord) type Flags = [Flag] grep :: String -> Flags -> [FilePath] -> IO [String] -grep pattern flags files = error "You need to implement this function." +grep string flags files = error "You need to implement this function." diff --git a/exercises/practice/grep/test/Tests.hs b/exercises/practice/grep/test/Tests.hs index 54a101ddc..577e1510b 100644 --- a/exercises/practice/grep/test/Tests.hs +++ b/exercises/practice/grep/test/Tests.hs @@ -1,5 +1,6 @@ {-# LANGUAGE RecordWildCards #-} +import Control.Monad ((>=>)) import Data.Foldable (for_) import Test.Hspec (Spec, describe, it, shouldBe, around) import Test.Hspec.Runner (configFailFast, defaultConfig, hspecWith) @@ -16,7 +17,7 @@ specs = describe "grep" $ for_ cases test test testCase@Case{..} = around (withFiles files) $ it description $ - \files -> grep string flags files >>= (\content -> content `shouldBe` expected) + grep string flags >=> (`shouldBe` expected) withFiles files runTest = do sys <- getTemporaryDirectory