{-# OPTIONS_HADDOCK hide #-}

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE LambdaCase #-}

module Imj.Input.NonBlocking
    ( -- * Non-blocking read
      tryGetKeyThenFlush
    ) where

import           Imj.Prelude

import           System.IO( hReady
                          , stdin)

import           Imj.Input.Types
import           Imj.Input.Blocking

callIf :: IO a -> IO Bool -> IO (Maybe a)
callIf call condition =
  condition >>= \case
    True  -> Just <$> call
    False -> return Nothing

-- | Tries to read a key from stdin. If it succeeds, it flushes stdin.
tryGetKeyThenFlush :: IO (Maybe Key)
tryGetKeyThenFlush = getKeyThenFlush `callIf` someInputIsAvailable
  where
    someInputIsAvailable = hReady stdin