content: import Data.List (find, findIndex, nub)
  import Data.Maybe (fromJust)
  import Data.Set (Set, fromList, insert, isSubsetOf, member)
  
  --- INFINITE STREAM OF RECAMAN SERIES OF GROWING LENGTH --
  rSeries :: [[Int]]
  rSeries =
    scanl
      ( \rs@(r : _) i ->
          let back = r - i
              nxt
                | 0 > back || elem back rs = r + i
                | otherwise = back
           in nxt : rs
      )
      [0]
      [1 ..]
  
  ----------- INFINITE STREAM OF RECAMAN-GENERATED ---------
  --------------- INTEGER SETS OF GROWING SIZE -------------
  rSets :: [(Set Int, Int)]
  rSets =
    scanl
      ( \(seen, r) i ->
          let back = r - i
              nxt
                | 0 > back || member back seen = r + i
                | otherwise = back
           in (insert nxt seen, nxt)
      )
      (fromList [0], 0)
      [1 ..]
  
  --------------------------- TEST -------------------------
  main :: IO ()
  main = do
    let setK = fromList [0 .. 1000]
    (putStrLn . unlines)
      [ "First 15 Recamans:",
        show . reverse . fromJust $ find ((15 ==) . length) rSeries,
        [],
        "First duplicated Recaman:",
        show . head . fromJust $ find ((/=) <$> length <*> (length . nub)) rSeries,
        [],
        "Length of Recaman series required to include [0..1000]:",
        show . fromJust $ findIndex (\(setR, _) -> isSubsetOf setK setR) rSets
      ]
  