~rootmos/AoC

bc78ad7b2ad8a55e4fa4b8e42683451bb3dfb2d3 — Gustav Behm 1 year, 3 months ago 8f92eb5
Add solution to AoC 2022 #17a
4 files changed, 129 insertions(+), 1 deletions(-)

A 2022/17.example
A 2022/17.hs
A 2022/17.input
M lib/Qulude.hs
A 2022/17.example => 2022/17.example +1 -0
@@ 0,0 1,1 @@
>>><<><>><<<>><>>><<<>>><<<><<<>><>><<>>

A 2022/17.hs => 2022/17.hs +125 -0
@@ 0,0 1,125 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE NoImplicitPrelude #-}
module Main where

import Qulude hiding ( State, render )

--import Data.Array ( (!) )
import qualified Data.Array as Array
import Data.Array.Unboxed ( (!) )
import qualified Data.Array.Unboxed as UArray
import qualified Data.Array.ST as STArray
import qualified Data.Either as Either
import qualified Data.List as List
--import Data.Array ( (!) )
import qualified Data.Map as Map
import qualified Data.Maybe as Maybe
import qualified Data.Sequence as Seq
import qualified Data.Set as Set

data Jet = L | R
  deriving ( Show, Eq, Ord )

type Parse = [ Jet ]
parser :: Parser Parse
parser = List.cycle <$> many jet <* newline
  where jet = (char '<' $> L) <|> (char '>' $> R)

type Rock = [ (Int, Int) ]
rocks :: [ Rock ]
rocks = List.cycle $ [ horizontal, plus, j, vertical, sq ]
  where horizontal = [ (0,0), (1,0), (2,0), (3,0) ]
        plus = [ (1,0), (0,1), (1,1), (2,1), (1,2) ]
        j = [ (0,0), (1,0), (2,0), (2,1), (2,2) ]
        vertical = [ (0,0), (0,1), (0,2), (0,3) ]
        sq = [ (0,0), (1,0), (0,1), (1,1) ]

type Row s = STUArray s Int Bool
newRow :: ST s (Row s)
newRow = STArray.newArray (0,6) False

data State s = State { cave :: STUArray s (Int,Int) Bool
                     , highestRock :: Int
                     }

newState :: ST s (State s)
newState = do
  cave <- STArray.newArray ((1,1), (7,8000)) False
  return $ State { cave, highestRock = 0 }

--highestRock :: State s -> ST s Int
--highestRock State { cave } = go cave (length cave)
  --where go [] y = return 0
        --go (r:rs) y = do
          --e <- empty r
          --if e then go rs (pred y) else return y
        --empty r = do
          --bs <- STArray.getElems r
          --return $ and (fmap not bs)

--extendCave :: Rock -> State s -> ST s (State s)
--extendCave r st = do
  --my <- highestRock st <&> \h -> h + 3 + (maximum $ fmap snd r)
  --rs <- sequence $ take (my - top) $ repeat newRow
  --return $ st { cave = rs ++ cave st }
  --where top = length $ cave st

aWildRockAppears :: Rock -> State s -> Rock
aWildRockAppears r st = fmap (\(x,y) -> (x+x0,y+y0)) r
  where y0 = highestRock st + 4
        x0 = 3

pushRock :: State s -> Jet -> Rock -> ST s Rock
pushRock st j r = (and <$> mapM f r') <&> \b -> if b then r' else r
  where r' = case j of
              L -> fmap (\(x,y) -> (x-1,y)) r
              R -> fmap (\(x,y) -> (x+1,y)) r
        f (x,y) | x < 1 = return False
        f (x,y) | x > 7 = return False
        f (x,y) | otherwise = not <$> xy (x,y)
        xy (x,y) = STArray.readArray (cave st) (x, y)

fall :: State s -> Rock -> ST s (Either Rock Rock)
fall st r = (and <$> mapM f r') <&> \b -> if b then Right r' else Left r
  where r' = fmap (\(x,y) -> (x,y-1)) r
        f (x,y) | y < 1 = return False
        f (x,y) | otherwise = not <$> xy (x,y)
        xy (x,y) = STArray.readArray (cave st) (x, y)

pinRock :: State s -> Rock -> ST s (State s)
pinRock st r = do
  mapM_ xy r
  hr <- go (highestRock st)
  return $ st { highestRock = hr }
  where xy (x,y) = STArray.writeArray (cave st) (x,y) True
        go hr = (or <$> sequence [ STArray.readArray (cave st) (x, succ hr) | x <- [1..7] ]) >>= \case
                  True -> go (succ hr)
                  False -> return hr

render :: Int -> UArray (Int, Int) Bool -> IO ()
render my cave = do
  putStrLn ""
  sequence_ [ putStrLn $ row y | y <- [my,my-1..1] ]
    where row y = [ if cave ! (x,y) then '#' else '.' | x <- [1..7] ]

partA js = runST $ newState >>= f 2022 rocks js
  where f 0 _ _ st = return $ highestRock st
        f t (r:rs) js st = do
          (r', js') <- g js st (aWildRockAppears r st)
          pinRock st r' >>= f (pred t) rs js'
        g (j:js) st r = pushRock st j r >>= fall st >>= \case
                          Left r' -> return (r', js)
                          Right r' -> g js st r'

--partB :: Parse -> Parse
--partB = id

main :: IO ()
main = with parser $ do
  run' "17.example" "a example" partA 3068
  run' "17.input" "a input" partA 3157
  --run "17.example" "b example" partB
  --run "17.input" "b input" partB

A 2022/17.input => 2022/17.input +1 -0
@@ 0,0 1,1 @@
>>>><<<<><<>>><<<>>>><<>>>><<<<>>><<>>>><<><<<<><<><<<<>><<>>>><>>><<>>>><<<>><>>>><<><>><<<><<><<<<><<<>>><<>>><<<<>>>><<>><<>>>><<<>>><<<>>>><<<><><>><<><<<<><>>>><>><<<><<<>>><><<<>><<<>>><<><<>>><>><<><<<<>>>><><<<<>>><<<>>>><<>>><<<>>><<>>>><<><><<<<>>><<<<>><<<><<<><<<>>>><<<<>>>><<<<>>><<>><<<>>>><><<<<>><<<><<<<>>><<>>><>>><<><>>><<>><<>>><<<>><<<<>>>><<><<>><<<<>>>><<><<><<<>><<><<<>>><<<<><<>><<<<>>>><<>>><<><>>><<>>><<<><>><<<<>><<<<><>>>><<><<><<>>>><><<>>><>>>><>><<<>><><>>><>>>><<<<>><><<><>>>><<<>>><><<<>>><<>><<>><><><<<>><>>>><>>>><>>><<><<<<>>>><>><<<<>><>>>><<<>><<<<>>>><<<<>><<<>>>><<>>>><<<<>>><<<<>>><>><<<>>>><<<>>>><>>>><<<<><>><<>>><<<>>>><<><<>><<<<><<<<><<<<>>>><<>>><>><<<>>><<<<><<>><<<<>>><<<<>>>><<>><<<<><<<>>><<<>><<<><<<><><>>><>>>><<<>>><<<>><<<<>>>><<<<>><<<<>><<<><<<<>>><>>>><<><<<>>>><<>>>><<><<<<>><<<>><<<<>><><<<><<><<>>>><<<>><<><<>>>><>><<<<><>>>><<>><<<><<<<>>><<>>><<>>>><>><><<>><<>>>><<>>>><<<<>>>><<<<>>><<<><>>><<<<>>>><<<<>>>><<<<>>>><>>><>><<>><<>>>><<>>>><>>>><<>>><<>>>><<>>>><<>><<<<>>><<>><<<<>>><>>><<<<>>><<<<>>><<<<>><<<>><<<<>><<<>><<>>>><<<>>>><<>>><<<>>>><<<<>>>><<<<><<<<>>>><>>>><<<<>>><<<<>>>><>>><<<><<><><<<><><<<>>>><>>><<><><<<<>><<>>>><<<>><>>><<<<>><>>><<<<>>>><<<<>>><>><<<>><<><>>><<<<>><<<<><>>><<<>>>><>>>><>>><<<>>><><>>>><<<><<<><<<<><<<>><<>>><<<<>>><<<>>>><<>>>><<<><<<<>>>><<<>>>><<>><<<<><<<<>>>><>>>><<<<>><<><<>>><<><>>>><<<>><<<><<<>>>><<<<><<<>>><<<<>>>><<><<>><>><<<<>>>><<>><<<><<<<>><<><<<>><<<><<<>>>><<<<><<<<>>><<<<>>>><<<<>>>><<<>>>><<<>><<>><>>><<<<>><>><>>>><<<><<<><<<<>>><<<>>>><<<>>>><<<<><<><<<<><<<>>><<>>>><<<>>><<<<>>><>>><<<<>>>><<<>>>><>>><<<<>>>><>><<<<>><<>>>><<>>>><<<><>>><<<>>>><<><<<<>>>><<<>>>><<>><<>><><<>><<<><>>><<>>><<<<><<><<>>>><<<><<<>><<>>><<<>>>><<<<><><<<<>>>><<<<>>>><<<<>><><>>>><<><<<<>>><<>><<<><><<<>>>><<<<>>>><<<>><<<<><<<<><<<>><>>><<<>>>><>>><<>>><<<<>><><<<>>>><<>>>><<<<>><<>><<<>><<>><<>>>><<<>><<<>>><>><>>><><<<>><>>><><<<>>><<<>><<<>>><<><<<>><<<>><<<<><>>>><<<>>><<<>>>><<<>>><>>><<>>><<>>>><<<>>><<<<>><<>>>><<>><<<<><>><<<>>><<<<>><<>>>><<>><<<>>>><<<>>><<>>><<<>>>><<<>><<>>>><<<>><>><<<><<<<>>><<>>>><<<>>>><<<><<<<>>><>>><<>>>><>>><<<<><>>>><<<>><<><>>><><<<<>>><<<<>>><<>>>><<<><<>>><>>>><<<<>>>><<<><<>>><<>>><>>>><><<<<><<<<>><<<<><<<<>>>><<<><<<<><>>><<<<>>>><<<<>>>><<<><>>><<<>>><<>><<>>>><<<<>>><<><<<<>><<<>><>>><>>>><>>><<>>><<><<><<<<>>>><>>><>>><<<<>>>><>><<><>>><<<<><<<>>><<<<><<<<><<>>>><<>>><<<<>><<<>>>><><><>>>><>>>><>>><><<>>><<<>><<<>>>><><<>>><>>><<>>>><<>><<<<>><<>>>><<<>>>><<<><<<><<<>>><<<>>>><<<<><<>>>><<>><<<>>><<<<>>><<<>>>><<<>>><<>><<>>><<>>><<<<>>><<><><>><><<<<>><<<<>>><<<>>><<<<>>><<>>>><<<<><<<>>>><<><<<>>>><<>><<>>><<<>>>><<>><<<<><<>><<><<<<><<<<>>>><>>><<<<><<<<><<<<>>>><<<<>><<<<>>><>>>><<>>><<>>>><<<<>>><<>>>><<>>>><<><<>>><<<<>>>><>>>><>><<>>><<>>><<<><<>>>><>>>><>>><<>>>><<<<>><<<<><<<<>>>><<<><<<>>><<<>>>><<>><<<>><<<>><<><<<<><>>><>><><<<<>>><<<>>><<<<>>>><<>>>><<<><<>>><<>>><>>>><<<<><><<<<>>>><><<<<>>><<<>>>><>>><><<>>>><<>>>><<<<>><<>><<>>>><<<<>>><>><><>>>><<<>>><<<<>>>><>>>><<<><>>>><<><<<<>>>><<<<>><<<>>>><<><<<<><<<<><<<>>><<><<<>>>><<<><<<<>>><<>>>><<><<<<>>>><<<>><<><><><<<<>>><>><>>><<<<>><<<<>><<<<>>>><<>><<<<>><<<>>><><<><<>><>><<<>>><<<<>>>><<<<><>>><>><<<><>><<<>>>><<<><>><<>>><>>>><<>>>><>>><<<>>><<<>>>><<<>>>><<><<>><<<<><<>>>><<>><><>>>><<<><<>>><<>><<><>><<<<>>>><<>>>><<<<><<>>><>>><>><>><<<<>><<>><<>>><>>><<<<><<>>>><>>>><<><>>><<<>>>><<<>>><<<>>><<>><>>><<<<>>>><>>><>><><<>>>><<<<>>><<<><<<<>><<<><<<<><<<>>><<<<>>><>>>><><>>><<>>>><<>>><<>>><<<<>><<<>>><<>>><<<<>>>><<<<>><<<>>>><<><<<><<<>><<<<>>>><>>><<<<>><<<>><><<<<>>><<<><<><<<<>>>><<>>><<<<>><<>><>><<<<>>>><<<>><>><<>>>><<>><<<<>>>><>>>><>><>>>><<<<>>><>>>><><>>>><>>><<>>><<<<>>>><>>>><<<>>><<<><<>>><<<<>><<<>>><<<<>>>><<<>>><<<<>><<><<><<<<>>>><>><<>><<>>><<><<><>>>><>>>><<<<><<<<><<<>><<>><<><>>><<<<>>><><>><<<<>>><<><<<>><<<>><<>>><>>>><>>>><>>>><<<<>>><<<<>><<>>><<<<>><<<>>>><<<<>>>><<<<>><<<>><><<>>>><>>><>><<>>><<<<>><>><<><<<>>>><<<<>><><<><<<>>>><<<>>><<<>>><<<<>>>><<<<>>>><>><>>>><<>>>><<<>>><<>>><<<>><<<>><<<>>>><<<<>>>><>>>><<>><<>>>><<<>>><<<>><<<<>>><>>>><>>>><<<<>>><<>>>><<<><>><<<<>>>><<<>>>><<<><<<>><><>>>><<<><<<<>>><<>>><<<>><<<<>><<<>><<><>>><>><<<><><>>><<>>><<<>>>><<><><<><>>>><<<><<<>><><<>><><<<>>><<<>>>><<<<>>><<<<><<<<>>>><<<>><<<>>><<>>>><<><<>>>><>><<<<>>><<><<><<><<<>>>><>>><>>>><>>><<<<><<<<><<<>>><<<>>><>><<<<>><<<<>><<><<<<>>>><<><>>><>><<<<>>>><<<<>>><>>><>>>><>><<>>><<<<>><<>><><><<>>>><<>>><<<>>>><<<>>><<>>><<>>><>>>><<<<>><>>>><<<<>>><<><<>><>>><>><<<>>>><<<>>>><>><<>><<<>>>><<<>>><<>>><<>>>><<><>><<>><<><<>><<<>>>><<<>>>><><<>><<>><>>>><>>>><<>><<<<>>><><>>><>>><<<<>>>><<>>>><<<<>><<<<>><<<<><<<>><<<<>>><>>>><<<>>><>><<>>>><<<>>><<<<>>><<><<>><<<<>>>><<<>>>><<<<>><<<<><<>>><><>>><<<<>>><<<>>>><<<><<<>>>><>>><<<<>>><><<<<>>>><<>><<<<>>>><<>>>><>>>><<<<><>><<>>>><>><<><<<<>><<<>><>>>><>>>><<<<>>><<<<><<<><<<>>>><>><<<><<<><>>><<<<>><><<<>>>><>><<<><<<>><<<<>>><<>>>><><<<>><>>>><>><>>>><<<>><<<<>><<<<>><<<<>>>><><<<>><><>>>><<>>><<<><<><><>>>><<>><<<<>>><<<<><>><<<><<>><<>>>><<<<>><<>>><>><<<><>>><>>><<><><<<><<<<>><><<<>><<<<><><<>><<<<>>><<>>>><<<<>><<>>>><<><<>>><<>>><<<<>><<<>>><<<>>>><<<>><<<>>><<<>>>><<<<>>><>>><<>>><<>><>><<<<>><<<<>>>><<<>><<<>>><<<>><<<<>>><<<<>><<<><<<>><<<<><<<<>><<<>>><<><<<><<>><<<>>><<>>>><>><><>>>><<<<>>>><<><<<>>><<<<>>><>>><<><<<<>>>><<<><<>><>>>><<<><<<>>><<><<<><<><>>>><<<>><<>>>><<<>><>>><<>><<>>>><<>><>>>><>>>><<<><<<>>>><<<>>>><<<>><>>>><><<<>>><<<<>>>><<>><<<<>>>><<>><<<>><<<>>><<<<>><>>>><>><<<<>>>><<<<><<><<<<>><<<>>>><<<<>>>><<>>>><>>>><<<<>><>>>><<<>>>><<<<><<<<>>>><<<<>>><<>>>><<>>>><<<>>>><<<>><<<<><>>>><<>>>><<>><<>>><<<<>><<<>>><<<>>><>>><<>>>><<<>>>><<>>><<<><<<>>>><<<><<<<>><<<<>>><>>><<<<>>><<><<<>>>><>><<<<>>><><<<>><<<<>>><<<<>><<<<>>><<>>>><<<><<<><<<>>><<<><>>>><<<><<<><>>>><>>><><<>><>><<<<>><<<<>><<>>><>>><>>>><<>><<>><>>>><>>>><<><><>>><<<>>><<<<>>>><<>>><<<>>><>>><<>><<<><<<>><<<><<>>>><<<<>>><<<><<<<>>>><<<<><>>><<<>>>><><<<><<<>>>><>><<<>><<><<<<><>>>><<<>>><<<>>>><>><>>>><><<><<<>>>><<>>><<<<>><<<<>><<>>>><<>><<<<>>>><<<>>><><><<<<>><<<<><<<>><<<>>><<<<><<<<>><<<<>><<<><<><>><<>>><<<><>><<<<>>>><>>>><<<<>>><<<>>><>>>><<>><<>>><<<<>>>><<>><<<<>><>>>><<<>>>><<>>><<<><<<><<>>>><<<<>>><<<>><<<<>>>><<>>><<>>>><>>><<<<>><>><<<>>><<<>><<<><>><<>>>><<<<>>><<<>><>>>><<<>><<>>><<<<><<<>><<>><<<>>>><<>>><<<<>>>><>>><>><<><><<<<>>><>>><<<<>>>><<<<>>>><<>><>>>><<<<>>><<<><<<<>>><<<<><<<><>><<<><<<<><>>><<<>>>><<>><<<<>>>><<<>>><<>>><<<<><<<>><<<>>><<<>><<<<>><<<><<>><>>>><<<>>>><<<>>>><<<<>>><<>><<<>>><<<<>><<<<><<<>>><<>>><>><<><<<<>><<<<>><<<>>><<>>><>>><<<<>><>>><<><<<>>>><>><<>><<<<>>><<><<<<>>><<<>>>><<<<><>><<<>><<>><<><>>>><>>>><<>><><<>>>><<><><<<><>><<<<>><<<<><<>>>><>>><<<<><<>>>><>><>>><>><<><>><>>><<<><<<>><><<<><<<<>><<>><<>>><<<>>>><<>><<><<<><<<<>>><>>>><<<>>><<<>>><<>>>><<>>>><<<<>>><>>>><>>>><<<<>>><<<>><><>>><<<>>>><<<<>>><<<>>>><<<>>><<<<>>>><<<>><>>><<>>>><<<><>>><>>>><<<<><<>>><><<>><<<<>>>><<<<>>>><<<>>>><<<<>>><<>>><<<><<>>><<<<>>>><<<>>><<<>>><<<>><<<<>><<<<>>>><<<><<<<>>><<<>>><<>>>><<<>>>><>><<<>><<<<>><<<<>>>><<<<><<<<>>><<><<><>>><<<<>><<>><<<><<>>>><<><<>>>><<<<>><><<<<>>>><<>><<<>>>><<><<<<><>><>>><<>><><<><<<>><<>>><>>>><>><<<><>>><<>>><<><>>><<<>><>>><<<<>>>><<>>>><<<<>>>><<<><<<>><<<<>>><><<<<>>><>>><<<>>><><<>>><<<>><<<<>>>><<<><<><>>><><<<>>>><<>><<<><>>><<>><<<><<<><<<>><><<>><<<>><<<>>><>><<<>>>><><>>><<<<>>><<<>>>><><>><<<<>><<<>>><<>>>><<<>><<>>>><>><><>>><<>>>><<<>>><<><><<>><<<<>>><<<>>>><>>><<>>>><>>><<<<>>>><<<<>><<><<<>>><>>><>>><><<>>><<<<>>>><<<<>>><<<>><>><<<>>>><<<<>>><<>>>><<<>><<>>><<<>><<<>>>><><<<<>><<>><<>><>>>><<<>><<>>><<><<<>><<<>><<<>>>><<<>>>><<<<>><<<>>>><><<>><><>>><<<<>><<<>><>><><>>><<<<>><<<<><<<>><<><<<<>>><<<<>>><<<>><><<<><<>>><<<<><<<><<<>>>><>><>><<<<>>>><><<>><<<><<<<>><<<><<>><<<>>><>><<<>>><<<>>>><<<<>>>><<<>>><<<<>>>><<<<>><<><<>>><<<<>><<<>>>><<<>>>><>>><>>>><>>>><<<<>>><<>>>><<<<><><<><<>><<>><>>>><<>><>>><><<<>>>><<>><><<<>>><>>>><<<<>>>><<<><<>>><<<<>>>><<<>>>><<<>><<<<><<<>>>><<<<>>>><<>>>><>><<<<><<><<<>>><>><<>>><<<<>>>><<<>>>><<>>>><><<>>><>>>><><<>>><<<>><<<>><<>><<<<>>><<<>>>><<<><<<<>>><<<>><<<><<<>><><>>><<<>><<<<>>><><<<>>>><>><>>><<<<>>><><<<<>>><><>>><><<<><>><<<>><>>><><<<><<>>><<<<><<<<>>>><<>>>><>>><<<>>><<>><>>>><<>>><<<>>>><<<>><<><>>>><<>>>><<<<><<<<><>>><>>><><<<<>>><<<<>><<<<>>><<<<>>><<<><<>>><<<>>>><<><<<<><<<>><<<<>>>><<<>>>><>>>><<>>>><<<<><<<<><<<>><<<<>><<<<>><><>>><>><>>>><<><<<>><>>><<<>><<<>>><<<>>><<<<><<<<>>>><<<><<<<>>><<<<><<>>><<<<><<>>>><<<>><<<>>><<<<>>>><<<>>><>>>><<<<><<<>>>><<<<><<>>><<<<>>>><<<><<<<>>><<<>><>><<>>><>>>><>>>><<<>>><>>><<<<>>><<>><>>>><>><>>>><<<<><<<<>>><<><<<><<<><>>><<>>>><>><>><>>><<<<>>>><><<>><<<>>>><<<>><<>>>><>><<<<><<<>>><<>>><<>>><<>><>><<>><>>><<<>><<<<><<<>><<<>>><<>><<<<>>><<>><<<<>>><<><<><<<<>>>><<<>>><<>><<>>>><<>><<>>><<<>>>><<<<>>><>>><<>><<>>><<<<>>><<<>>>><<>>><<<>><><<>>><<<>>><>>><<<<>><<<<><<<><<<>>><<>><<><<><<<<>>><<>>><>>>><<<>>><<<>><<>>><>><<>><<>><<<><<<><<>><<><>><<><>>><<<<><<<<>><<<<>>>><>><<<<><<<>>>><<>>><<<<>>><<<<>>><<>>>><<<>>>><<><<<<>>>><<<><<<<>>>><<<>><<<<><<<>><<>>>><>><<<<>><<>>><><<<<>>>><<<>>><<<<><<<<>>>><>>><>>><<<><<<><<<<><<<>>>><><<>>>><>><><<<<>><<<<>>><<>><<<>><<<><>><<>><<<>>>><><<<>>>><>>><<<>>><<<<><<<<>>><<<><><<<><<>>>><<<<>><<>>>><><<<<>>><<<><<<><>>>><<<<>>>><<<<><<<<>><<<>>><<>>><>>><<<<>><><<<>>><<<<>><><<>><<<>>><<>>><<<>>>><<<<>><>><<<<>>>><<>>><>>><<<<>>><>>><<<><<<<>>><>>><><>><<>>><<>><<<<>><<<<>><<<><<<>>><<<>>>><<>>><<<>><<<<>>>><>>><<><<>>><>>><<>>><<><<<<>>><<><<<<><<<>>>><<<<><<<<><>>><>>>><<<<>><<>><<<<><<<>>>><<>><>>>><>>>><<><<<<><<<<>>><<<>>><<<<>>>><><<<>>>><<<<>>>><><<>>><>>>><<<<>>>><<<>>>><>><<<>>><<<<><<>><<>>>><<<><><<>>>><<>>><>>>><<<>><<><>>>><>><<<>><<<>>>><<>>><<<>><<><<>>><<>>><>><<<>><>><<<<>>><<<<><<>>>><<<><>>><<>>>><><<<<>><<<>>>><><<<<>>><<<<>>><>>>><>>>><>>>><<<>><<<<>>>><<>><<><<>>><<<><><<<><<<<>>>><<><<><<<>>><>>><>><<>><<<<>>><<>><<<<>>><<<><<>>><<><<<>>><>>><<>><<><><<<<>><>>

M lib/Qulude.hs => lib/Qulude.hs +2 -1
@@ 57,7 57,7 @@ module Qulude ( module Prelude

              , unsafePerformIO

              , Array
              , Array, UArray
              , STArray, STUArray
              , Map
              , Set


@@ 80,6 80,7 @@ import Data.Functor.Identity
import Data.Word

import Data.Array ( Array )
import Data.Array.Unboxed ( UArray )
import Data.Array.ST ( STArray, STUArray )
import Data.Map ( Map )
import Data.Sequence ( Seq )