content: import Data.List (intercalate, transpose, uncons, unfoldr)
  import Data.List.Split (chunksOf)
  import Data.Numbers.Primes (isPrime)
  import Text.Printf (printf)
  
  -------------------- JACOBSTHAL NUMBERS ------------------
  
  jacobsthal :: [Integer]
  jacobsthal = jacobsthalish (0, 1)
  
  jacobsthalish :: (Integer, Integer) -> [Integer]
  jacobsthalish = unfoldr go
    where
      go (a, b) = Just (a, (b, 2 * a + b))
  
  --------------------------- TEST -------------------------
  main :: IO ()
  main =
    mapM_
      (putStrLn . format)
      [ ( "terms of the Jacobsthal sequence",
          30,
          jacobsthal
        ),
        ( "Jacobsthal-Lucas numbers",
          30,
          jacobsthalish (2, 1)
        ),
        ( "Jacobsthal oblong numbers",
          20,
          zipWith (*) jacobsthal (tail jacobsthal)
        ),
        ( "Jacobsthal primes",
          10,
          filter isPrime jacobsthal
        )
      ]
  
  format :: (String, Int, [Integer]) -> String
  format (k, n, xs) =
    show n <> (' ' : k) <> ":\n"
      <> table
        "  "
        (chunksOf 5 $ show <$> take n xs)
  
  table :: String -> [[String]] -> String
  table gap rows =
    let ws = maximum . fmap length <$> transpose rows
        pw = printf . flip intercalate ["%", "s"] . show
     in unlines $ intercalate gap . zipWith pw ws <$> rows
  