content: {-
    Copyright (c) Meta Platforms, Inc. and affiliates.
    All rights reserved.
  
    This source code is licensed under the BSD-style license found in the
    LICENSE file in the root directory of this source tree.
  -}
  
  {-# LANGUAGE DeriveDataTypeable #-}
  {-# LANGUAGE GADTs #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE StandaloneDeriving #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE GeneralizedNewtypeDeriving #-}
  {-# LANGUAGE FlexibleInstances #-}
  
  module SleepDataSource (
      Sleep, sleep,
    ) where
  
  import Haxl.Prelude
  import Prelude ()
  
  import Haxl.Core
  import Haxl.DataSource.ConcurrentIO
  
  import Control.Concurrent
  import Data.Hashable
  import Data.Typeable
  
  sleep :: Int -> GenHaxl u w Int
  sleep n = dataFetch (Sleep n)
  
  data Sleep deriving Typeable
  instance ConcurrentIO Sleep where
    data ConcurrentIOReq Sleep a where
      Sleep :: Int -> ConcurrentIOReq Sleep Int
  
    performIO (Sleep n) = threadDelay (n*1000) >> return n
  
  deriving instance Eq (ConcurrentIOReq Sleep a)
  deriving instance Show (ConcurrentIOReq Sleep a)
  
  instance ShowP (ConcurrentIOReq Sleep) where showp = show
  
  instance Hashable (ConcurrentIOReq Sleep a) where
    hashWithSalt s (Sleep n) = hashWithSalt s n
  