BingWallpapers: Fetches and applies the image of the day from Bing as the wallpaper Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)Compute the day of the year“Day-of-the-week-finder”Converting image size from Maybe (Int, Int) to (Float, Float)Quote of the day programWriting values from JSON on image and display imageDay finder program, inputs date, outputs day of the weekAdvent of Code 2017 - day 8 solutionAdvent of code: day 1AoC Day 22: Sporifica Virus Part 1, a Solution in Beginner's HaskellReading and returning the HTML content from a specified URL

Why does the remaining Rebel fleet at the end of Rogue One seem dramatically larger than the one in A New Hope?

Should I follow up with an employee I believe overracted to a mistake I made?

Do wooden building fires get hotter than 600°C?

How do I find out the mythology and history of my Fortress?

Sum letters are not two different

Amount of permutations on an NxNxN Rubik's Cube

Why doesn't SQL Optimizer use my constraint?

Does the Weapon Master feat grant you a fighting style?

How would a mousetrap for use in space work?

Find 108 by using 3,4,6

How could we fake a moon landing now?

SF book about people trapped in a series of worlds they imagine

Is there hard evidence that the grant peer review system performs significantly better than random?

Why do we need to use the builder design pattern when we can do the same thing with setters?

Performance gap between bool std:vector and array

Central Vacuuming: Is it worth it, and how does it compare to normal vacuuming?

What is this clumpy 20-30cm high yellow-flowered plant?

What is a fractional matching?

How to compare two different files line by line in unix?

If windows 7 doesn't support WSL, then what does Linux subsystem option mean?

Should I use a zero-interest credit card for a large one-time purchase?

How to write this math term? with cases it isn't working

Why should I vote and accept answers?

Denied boarding although I have proper visa and documentation. To whom should I make a complaint?



BingWallpapers: Fetches and applies the image of the day from Bing as the wallpaper



Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 00:00UTC (8:00pm US/Eastern)Compute the day of the year“Day-of-the-week-finder”Converting image size from Maybe (Int, Int) to (Float, Float)Quote of the day programWriting values from JSON on image and display imageDay finder program, inputs date, outputs day of the weekAdvent of Code 2017 - day 8 solutionAdvent of code: day 1AoC Day 22: Sporifica Virus Part 1, a Solution in Beginner's HaskellReading and returning the HTML content from a specified URL



.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








6












$begingroup$


I have written a small desktop program nabeelomer/BingWallpapers in Haskell. This is my first time writing Haskell.



I was wondering how I can make the code use more functional programming features/idioms/patterns.



Any other suggestions on how to improve the code are also welcome.



-- Copyright (C) Nabeel Omer 2017
-- See the LICENSE file for the license
--

import Network.HTTP.Conduit
import System.Process
import qualified Data.ByteString.Lazy.Char8 as L8
import GHC.IO.Exception

main :: IO ()
main = do
-- using http://muzzammil.xyz/git/bing/
metadata <- get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"

-- Guaranteed by the API
putStrLn $ (split '>' $ (lines $ L8.unpack metadata)!!1)!!1
let url = (lines $ L8.unpack metadata)!!0
picture <- get $ (split '>' url)!!1

L8.writeFile "/dev/shm/Bing-Wallpaper" picture
exitcode <- setWallpaper "/dev/shm/Bing-Wallpaper"

print exitcode
return ()

-- From StackOverflow
split :: Eq a => a -> [a] -> [[a]]
split d [] = []
split d s = x : split d (drop 1 y) where (x,y) = span (/= d) s

get :: String -> IO L8.ByteString
get url = simpleHttp url

setWallpaper :: String -> IO GHC.IO.Exception.ExitCode
setWallpaper uri = system $ "gsettings set org.gnome.desktop.background picture-uri file://" ++ uri









share|improve this question











$endgroup$




bumped to the homepage by Community 19 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.





















    6












    $begingroup$


    I have written a small desktop program nabeelomer/BingWallpapers in Haskell. This is my first time writing Haskell.



    I was wondering how I can make the code use more functional programming features/idioms/patterns.



    Any other suggestions on how to improve the code are also welcome.



    -- Copyright (C) Nabeel Omer 2017
    -- See the LICENSE file for the license
    --

    import Network.HTTP.Conduit
    import System.Process
    import qualified Data.ByteString.Lazy.Char8 as L8
    import GHC.IO.Exception

    main :: IO ()
    main = do
    -- using http://muzzammil.xyz/git/bing/
    metadata <- get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"

    -- Guaranteed by the API
    putStrLn $ (split '>' $ (lines $ L8.unpack metadata)!!1)!!1
    let url = (lines $ L8.unpack metadata)!!0
    picture <- get $ (split '>' url)!!1

    L8.writeFile "/dev/shm/Bing-Wallpaper" picture
    exitcode <- setWallpaper "/dev/shm/Bing-Wallpaper"

    print exitcode
    return ()

    -- From StackOverflow
    split :: Eq a => a -> [a] -> [[a]]
    split d [] = []
    split d s = x : split d (drop 1 y) where (x,y) = span (/= d) s

    get :: String -> IO L8.ByteString
    get url = simpleHttp url

    setWallpaper :: String -> IO GHC.IO.Exception.ExitCode
    setWallpaper uri = system $ "gsettings set org.gnome.desktop.background picture-uri file://" ++ uri









    share|improve this question











    $endgroup$




    bumped to the homepage by Community 19 mins ago


    This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.

















      6












      6








      6





      $begingroup$


      I have written a small desktop program nabeelomer/BingWallpapers in Haskell. This is my first time writing Haskell.



      I was wondering how I can make the code use more functional programming features/idioms/patterns.



      Any other suggestions on how to improve the code are also welcome.



      -- Copyright (C) Nabeel Omer 2017
      -- See the LICENSE file for the license
      --

      import Network.HTTP.Conduit
      import System.Process
      import qualified Data.ByteString.Lazy.Char8 as L8
      import GHC.IO.Exception

      main :: IO ()
      main = do
      -- using http://muzzammil.xyz/git/bing/
      metadata <- get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"

      -- Guaranteed by the API
      putStrLn $ (split '>' $ (lines $ L8.unpack metadata)!!1)!!1
      let url = (lines $ L8.unpack metadata)!!0
      picture <- get $ (split '>' url)!!1

      L8.writeFile "/dev/shm/Bing-Wallpaper" picture
      exitcode <- setWallpaper "/dev/shm/Bing-Wallpaper"

      print exitcode
      return ()

      -- From StackOverflow
      split :: Eq a => a -> [a] -> [[a]]
      split d [] = []
      split d s = x : split d (drop 1 y) where (x,y) = span (/= d) s

      get :: String -> IO L8.ByteString
      get url = simpleHttp url

      setWallpaper :: String -> IO GHC.IO.Exception.ExitCode
      setWallpaper uri = system $ "gsettings set org.gnome.desktop.background picture-uri file://" ++ uri









      share|improve this question











      $endgroup$




      I have written a small desktop program nabeelomer/BingWallpapers in Haskell. This is my first time writing Haskell.



      I was wondering how I can make the code use more functional programming features/idioms/patterns.



      Any other suggestions on how to improve the code are also welcome.



      -- Copyright (C) Nabeel Omer 2017
      -- See the LICENSE file for the license
      --

      import Network.HTTP.Conduit
      import System.Process
      import qualified Data.ByteString.Lazy.Char8 as L8
      import GHC.IO.Exception

      main :: IO ()
      main = do
      -- using http://muzzammil.xyz/git/bing/
      metadata <- get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"

      -- Guaranteed by the API
      putStrLn $ (split '>' $ (lines $ L8.unpack metadata)!!1)!!1
      let url = (lines $ L8.unpack metadata)!!0
      picture <- get $ (split '>' url)!!1

      L8.writeFile "/dev/shm/Bing-Wallpaper" picture
      exitcode <- setWallpaper "/dev/shm/Bing-Wallpaper"

      print exitcode
      return ()

      -- From StackOverflow
      split :: Eq a => a -> [a] -> [[a]]
      split d [] = []
      split d s = x : split d (drop 1 y) where (x,y) = span (/= d) s

      get :: String -> IO L8.ByteString
      get url = simpleHttp url

      setWallpaper :: String -> IO GHC.IO.Exception.ExitCode
      setWallpaper uri = system $ "gsettings set org.gnome.desktop.background picture-uri file://" ++ uri






      beginner haskell http






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Jun 26 '17 at 5:55







      1 -_-

















      asked Jun 25 '17 at 20:38









      1 -_-1 -_-

      315




      315





      bumped to the homepage by Community 19 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.







      bumped to the homepage by Community 19 mins ago


      This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.






















          1 Answer
          1






          active

          oldest

          votes


















          0












          $begingroup$

          Pattern matching instead of !!, inlining of single-use names where straightforward.



          import Data.List.Split

          main = do
          (_:picurl:_):(_:title:_):_ <- map (wordsBy (=='>')) . lines . L8.unpack
          <$> get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"
          putStrLn title
          L8.writeFile "/dev/shm/Bing-Wallpaper" =<< get picurl
          print =<< setWallpaper "/dev/shm/Bing-Wallpaper"





          share|improve this answer









          $endgroup$












          • $begingroup$
            Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
            $endgroup$
            – 1 -_-
            Jun 27 '17 at 19:08










          • $begingroup$
            (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
            $endgroup$
            – Gurkenglas
            Jun 27 '17 at 21:08






          • 1




            $begingroup$
            You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
            $endgroup$
            – Zeta
            Jun 29 '17 at 7:05











          Your Answer






          StackExchange.ifUsing("editor", function ()
          StackExchange.using("externalEditor", function ()
          StackExchange.using("snippets", function ()
          StackExchange.snippets.init();
          );
          );
          , "code-snippets");

          StackExchange.ready(function()
          var channelOptions =
          tags: "".split(" "),
          id: "196"
          ;
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function()
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled)
          StackExchange.using("snippets", function()
          createEditor();
          );

          else
          createEditor();

          );

          function createEditor()
          StackExchange.prepareEditor(
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader:
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          ,
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          );



          );













          draft saved

          draft discarded


















          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f166622%2fbingwallpapers-fetches-and-applies-the-image-of-the-day-from-bing-as-the-wallpa%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          0












          $begingroup$

          Pattern matching instead of !!, inlining of single-use names where straightforward.



          import Data.List.Split

          main = do
          (_:picurl:_):(_:title:_):_ <- map (wordsBy (=='>')) . lines . L8.unpack
          <$> get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"
          putStrLn title
          L8.writeFile "/dev/shm/Bing-Wallpaper" =<< get picurl
          print =<< setWallpaper "/dev/shm/Bing-Wallpaper"





          share|improve this answer









          $endgroup$












          • $begingroup$
            Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
            $endgroup$
            – 1 -_-
            Jun 27 '17 at 19:08










          • $begingroup$
            (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
            $endgroup$
            – Gurkenglas
            Jun 27 '17 at 21:08






          • 1




            $begingroup$
            You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
            $endgroup$
            – Zeta
            Jun 29 '17 at 7:05















          0












          $begingroup$

          Pattern matching instead of !!, inlining of single-use names where straightforward.



          import Data.List.Split

          main = do
          (_:picurl:_):(_:title:_):_ <- map (wordsBy (=='>')) . lines . L8.unpack
          <$> get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"
          putStrLn title
          L8.writeFile "/dev/shm/Bing-Wallpaper" =<< get picurl
          print =<< setWallpaper "/dev/shm/Bing-Wallpaper"





          share|improve this answer









          $endgroup$












          • $begingroup$
            Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
            $endgroup$
            – 1 -_-
            Jun 27 '17 at 19:08










          • $begingroup$
            (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
            $endgroup$
            – Gurkenglas
            Jun 27 '17 at 21:08






          • 1




            $begingroup$
            You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
            $endgroup$
            – Zeta
            Jun 29 '17 at 7:05













          0












          0








          0





          $begingroup$

          Pattern matching instead of !!, inlining of single-use names where straightforward.



          import Data.List.Split

          main = do
          (_:picurl:_):(_:title:_):_ <- map (wordsBy (=='>')) . lines . L8.unpack
          <$> get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"
          putStrLn title
          L8.writeFile "/dev/shm/Bing-Wallpaper" =<< get picurl
          print =<< setWallpaper "/dev/shm/Bing-Wallpaper"





          share|improve this answer









          $endgroup$



          Pattern matching instead of !!, inlining of single-use names where straightforward.



          import Data.List.Split

          main = do
          (_:picurl:_):(_:title:_):_ <- map (wordsBy (=='>')) . lines . L8.unpack
          <$> get "http://cdn.muzzammil.xyz/bing/bing.php?format=text&cc=IN"
          putStrLn title
          L8.writeFile "/dev/shm/Bing-Wallpaper" =<< get picurl
          print =<< setWallpaper "/dev/shm/Bing-Wallpaper"






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Jun 27 '17 at 13:53









          GurkenglasGurkenglas

          2,967512




          2,967512











          • $begingroup$
            Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
            $endgroup$
            – 1 -_-
            Jun 27 '17 at 19:08










          • $begingroup$
            (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
            $endgroup$
            – Gurkenglas
            Jun 27 '17 at 21:08






          • 1




            $begingroup$
            You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
            $endgroup$
            – Zeta
            Jun 29 '17 at 7:05
















          • $begingroup$
            Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
            $endgroup$
            – 1 -_-
            Jun 27 '17 at 19:08










          • $begingroup$
            (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
            $endgroup$
            – Gurkenglas
            Jun 27 '17 at 21:08






          • 1




            $begingroup$
            You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
            $endgroup$
            – Zeta
            Jun 29 '17 at 7:05















          $begingroup$
          Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
          $endgroup$
          – 1 -_-
          Jun 27 '17 at 19:08




          $begingroup$
          Can you please explain how the map (wordsBy (=='>')) . lines . L8.unpack <$> get part works?
          $endgroup$
          – 1 -_-
          Jun 27 '17 at 19:08












          $begingroup$
          (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
          $endgroup$
          – Gurkenglas
          Jun 27 '17 at 21:08




          $begingroup$
          (<$>) :: Functor f => (a -> b) -> f a -> f b is an infix synonym for fmap, and fmap f x is like x >>= return . f for monads. map applies Data.List.Split's wording of split to both lines where you'd do it to each manually. (f . g) x = f (g x) and . has higher precedence than <$>, so all of the left of <$> is fmaped over its right. Feel free to keep your comments around, of course.
          $endgroup$
          – Gurkenglas
          Jun 27 '17 at 21:08




          1




          1




          $begingroup$
          You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
          $endgroup$
          – Zeta
          Jun 29 '17 at 7:05




          $begingroup$
          You have presented an alternative solution, but only slightly reviewed the code. Please explain your reasoning (how your solution works and why it is better than the original) in the post, not in the comments, so that the author and other readers can learn from your thought process.
          $endgroup$
          – Zeta
          Jun 29 '17 at 7:05

















          draft saved

          draft discarded
















































          Thanks for contributing an answer to Code Review Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid


          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.

          Use MathJax to format equations. MathJax reference.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f166622%2fbingwallpapers-fetches-and-applies-the-image-of-the-day-from-bing-as-the-wallpa%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          名間水力發電廠 目录 沿革 設施 鄰近設施 註釋 外部連結 导航菜单23°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.7113923°50′10″N 120°42′41″E / 23.83611°N 120.71139°E / 23.83611; 120.71139計畫概要原始内容臺灣第一座BOT 模式開發的水力發電廠-名間水力電廠名間水力發電廠 水利署首件BOT案原始内容《小檔案》名間電廠 首座BOT水力發電廠原始内容名間電廠BOT - 經濟部水利署中區水資源局

          格濟夫卡 參考資料 导航菜单51°3′40″N 34°2′21″E / 51.06111°N 34.03917°E / 51.06111; 34.03917ГезівкаПогода в селі 编辑或修订