packages feed

ranged-list-0.1.0.0: sample/password.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

import Data.List.Range
import System.IO

import qualified Data.ByteString.Char8 as BSC

type Password = RangeL 8 127 Char

getRangedPassword :: Unfoldr 0 n m => IO (Maybe (RangeL n m Char))
getRangedPassword = do
	e <- hGetEcho stdin
	hSetEcho stdin False
	unfoldrMRangeMaybe ((/= '\n') <$> hLookAhead stdin) getChar
		<* hSetEcho stdin e

passwordToByteString :: Password -> BSC.ByteString
passwordToByteString = foldr BSC.cons ""

main :: IO ()
main = do
	p <- getRangedPassword
	print p
	maybe (error "bad password length") BSC.putStrLn $ passwordToByteString <$> p