рдмрд╣реБрдд рджреЗрд░ рд╕реЗ - 'рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдЕрдм рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ
рдЪрд╛рд░реЛрдВ рддрд░рдл рднрд┐рдХреНрд╖реБ рд╣реИрдВ
IO, рд░рд╛рдЬреНрдп рдФрд░ рд╕реВрдЪрд┐рдпрд╛рдБ рд▓рд╛рдЬрд┐рдореА рд╣реИ
рдпрд╣ рдЖрд╕рд╛рди рд╣реИ, рдЬреИрд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреВрд░ рд╣реЛ рдЧрдпрд╛!
рд╢рд╛рдпрдж - рдК,
рдпрд╣ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рднреА рд╣реИ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ
рдореБрдЭреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?
рдлрд┐рд░ рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдкрд╛рдЧрд▓рдкрди, рдФрд░ рдлрд┐рд░ рднреА рдЙрдирдХреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдкреНрд░рдпрд╛рд╕ред рдЕрдЧрд╛рдз рдХреНрд▓рд╛рд╕рд┐рдХред
рдореИрдВ рдПрдХ рднрд╡реНрдп рдХрд╣рд╛рдиреА
(рдкрд╛рдереЛрд╕ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЧрд┐рд░рддрд╛) рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХрдмрд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХ рд╣реЛрдВрдЧреЗ
(рдореИрдВ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдореВрд░реНрдЦ рдордд рдмрдиреЛ) - рдкрд░рд┐рдЪрд┐рдд рдЪрд░рд┐рддреНрд░, рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдП рдЧрдП рдмреНрд░рд╣реНрдорд╛рдВрдб рдФрд░ рдПрдХ рдЦреБрд▓реЗ рдЕрдВрдд
(рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ ...) ред
рдереЛрдбрд╝реА рдЧрдВрднреАрд░рддрд╛ рдХрднреА рджрд░реНрдж рдирд╣реАрдВ рджреЗрддреАред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ, рд╣рд╛рд╕реНрдп рдХреЗ рдорд╛рдореВрд▓реА рд╕рдВрдХреЗрдд рдХреЗ рдмрд┐рдирд╛, рдореИрдВ рдЗрд╕ рдкрд╛рда рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рддрд░реНрдХ рдмрддрд╛рдКрдВрдЧрд╛ред рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ (рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЦреБрдж рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА) рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдПрдХ рджрд░реНрджрдирд╛рдХ рдХрд░реАрдм, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЕрдкрдиреЗ рдЖрдк рдкрд░ рдЧрд░реНрд╡ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдг, рдХреМрд╢рд▓ рдФрд░ рдПрдХ рдФрд░ рддрд░реНрдХ рджреЗрдЧрд╛ред рдПрдХ рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдЧрд┐рдердм рдкрд░ рднрдВрдбрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдиреЗ рд╡рд╛рд▓реА рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ред рджрд░рдЕрд╕рд▓, рдЗрд╕рдореЗрдВ рдЧрд┐рдЯрдм рдПрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрдЧрд╛ - рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдЬрд╕рдиред
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред
рдореЙрдбреНрдпреВрд▓ рдирд┐рд░реНрдорд╛рдг
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдПрдВред
cabal init
рдПрдХ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЗрдмрд▓ рдХреБрдЫ рд╕рд╡рд╛рд▓ рдкреВрдЫреЗрдЧрд╛, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓
project_name.cabal рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбреНрдпреВрд▓ рд░рд┐рдХреНрдд
рдорд┐рд▓реЗрдЧрд╛ ред рдЕрдзрд┐рдХ рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЗ рд▓рд┐рдП, рдореЙрдбреНрдпреВрд▓ рдореЗрдВ
src рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЗрд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
executable project-name hs-source-dirs: src main-is: Main.hs
рдмреЗрд╢рдХ,
Main.hs рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ)
рдлрд┐рд░
рдирд┐рд░реНрднрд░рддрд╛ рдирд░рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдПрдХ рд╡реНрдпрдерд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ рдкреНрд░рдЧрддрд┐ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рддрд╛ рд╣реИред рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдпреБрд╡рд╛ рд╣реИрдВ рдФрд░ рдлреИрд╢рдиреЗрдмрд▓ рд╕рдм рдХреБрдЫ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирд╡реАрдирддрдо рдХреИрдмрд▓-1.18 рд╕реБрд╡рд┐рдзрд╛ - рд╕реИрдВрдбреЛрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рджрд░рдЕрд╕рд▓, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
cabal sandbox init cabal install --only-dependencies
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
cabal build
рдпрджрд┐ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреА рддреАрд╡реНрд░ рдЗрдЪреНрдЫрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдЕрдВрджрд░ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдФрд░, рд╢реИрд▓реА рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдРрд╕реА рдЗрдЪреНрдЫрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧреА), рддреЛ рдЖрдк рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ
рдШреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ
cabal repl
рд╕рдм рдХреБрдЫ, рдПрдХ рдЦрд╛рд▓реА рдХреИрдЯрд▓реЙрдЧ рдХрд╛ рдбрд░ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
http-рдирд╛рд▓реА
рдкрд╣рд▓рд╛ рдХрд╛рдо рдЬрд┐рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ рдЬреЛрд╕рди рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ рдХрдорд┐рдЯреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЛрдб рдХрд░рдирд╛ред рджрд░рдЕрд╕рд▓, рд╕реНрд░реЛрдд
рд╕реНрдкрд╖реНрдЯ рд╣реИ , рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдЪреАрдЬреЗрдВ рд╡рд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╣рдо рд╕реВрд░рдЬ рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ
рдПрдбрд╡рд░реНрдб рд╕реНрдиреЛ рдорд╛рдЗрдХрд▓ рд╕реНрдиреЙрдпрдореИрди рдХреЗ рд▓реЗрдЦрдХрддреНрд╡ рдХреЗ рд▓рд┐рдП
http- conduit рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рд▓реА рдПрдХ рдмрдврд╝рд┐рдпрд╛ рдЙрдкрд╛рдп рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрддрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП
eax рдирд╛рдордХ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдореИрдВ рдЕрднреА рдереЛрдбрд╝рд╛ рдФрд░ рдкрд░рд┐рдзрд┐ рдкрд░ рдмрддрд╛рдКрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг-рдирд┐рд░реНрднрд░ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреЛрдбрд╝реЗрдВред
bytestring >= 0.10, conduit >= 1.0, http-conduit >= 1.9,
рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
рдЕрдм рд╣рдо рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдФрд░ рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
рд╡рд┐рд╕реНрддрд╛рд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
{-# LANGUAGE OverloadedStrings #-}
рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
import Data.Conduit import Network.HTTP.Conduit import qualified Data.Conduit.Binary as CB import qualified Data.ByteString.Char8 as BS
рд╕рднреА json рдбрд╛рдЙрдирд▓реЛрдб рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ
main = do manager <- newManager def req <- parseUrl "https://api.github.com/../.." let headers = requestHeaders req req' = req { requestHeaders = ("User-agent", "some-app") : headers } runResourceT $ do res <- http req' manager responseBody res $$+- CB.lines =$ parserSink
рдЬрд╣рд╛рдБ рддрдХ рдореБрдЭреЗ рдпрд╛рдж рд╣реИ, github api рдХреЗ рд▓рд┐рдП
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рд╣реЗрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдереЛрдбрд╝рд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореБрдЦреНрдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрдВрддрд┐рдо рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдкрд░рд┐рдгрд╛рдо рдПрдХ
рд░рд┐рд╕реЛрд░реНрд╕ рдЯреНрд░рд╛рдиреНрд╕рдлрд╝реЙрд░реНрдорд░ рдореЗрдВ рд▓рд┐рдкрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рдиреНрд╕ рдХреЛ runResourceT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдирд┐рдХрд╛рдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реЗ рд╕реНрдЯреЙрдХ рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЬреЗрдВрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ
parserSink :: Sink BS.ByteString (ResourceT IO) () parserSink = do md <- await case md of Nothing -> return () Just d -> parseCommits d
рдпрджрд┐ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реНрдЯреЙрдХ рдХреЗрд╡рд▓ рдкреНрд░рд╛рдкреНрдд рдЬреЛрдВрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ (рдЬрд╛рджреВ рдХрд╛ рдпрд╣ рднрд╛рдЧ рдкрд╛рд░реНрд╕реЗрдХрдореЗрдЯреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ)ред
Aeson
рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реЛрдЪ рдХреЛ рд╡рд┐рдХреГрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рд▓рд┐рдП, рд╣рдо
Aeson рдирд╛рдордХ рдПрдХ рдЕрддреНрдпрдВрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬреЛ рдЖрджрдд рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВ, рдПрдХ рд╕реНрддреВрдк рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВ:
- рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЬрд╕рди рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ
- рдЕрдЧрд░ рдореИрдВрдиреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛рдпрд╛, рддреЛ рдРрд╕рди рдЖрд▓рд╕реА рдмрд╛рдпрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд╕рдЦреНрдд рдмрд╛рдИрдЯреНрд░рд╕реНрдЯрд┐рдВрдЧ рдирд╛рд▓реА рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд░рддрдм рджрд┐рдЦрд╛рдиреЗ рд╣реЛрдВрдЧреЗ
рддреЛ, рдкрд╣рд▓реЗ рд╣рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЬреМрди рд╕реЗ рднрдЯреНрдареА рдореЗрдВ рднреЗрдЬрддреЗ рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ url, рд╣реИрд╢ рдФрд░ рдХрдорд┐рдЯ рдореИрд╕реЗрдЬ рдЫреЛрдбрд╝реЗрдВрдЧреЗред
import qualified Data.ByteString.Char8 as BS import Data.Aeson (FromJSON(..)) data CommitInfo = CommitInfo { message :: BS.ByteString } deriving (Show) data Commit = Commit { sha :: BS.ByteString, url :: BS.ByteString, commit :: CommitInfo } deriving (Show)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ рдЬреБрд╕рди рдФрд░ рдЦреЗрддреЛрдВ рдХреЗ рдорд┐рд▓рд╛рди рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд┐рд╣рд┐рдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдо рд╕рднреА рдХреЛ рдзреЛрдЦрд╛ рджреЗрдВрдЧреЗ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
{-# LANGUAGE DeriveGeneric #-} import GHC.Generics (Generic)
рдФрд░ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдЬреЗрдиреЗрд░рд┐рдХ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдЬреЛрдбрд╝реЗрдВ
deriving(Show, Generic)
рдпрд╣ рдХреЗрд╡рд▓ json рд╕реЗ рдХрдорд┐рдЯ рдФрд░ рдХрдорд┐рдЯрдЗрдиреНрдлреЛ рдмрдирд╛рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ
instance FromJSON Commit instance FromJSON CommitInfo
рдлрд┐рдирд┐рд╢ рд▓рд╛рдЗрди рдХреЗ рдХреБрдЫ рд╣реА рдХрджрдо, рд╣рдо рд▓рдЧрднрдЧ рд╡рд╣рд╛рдБ рд╣реИрдВ
parseCommits :: BS.ByteString -> Sink BS.ByteString (ResourceT IO) () parseCommits rawData = do let parsedData = decode $ BL.fromChunks [rawData] :: Maybe [Models.Commit] case parsedData of Nothing -> liftIO $ BS.putStrLn "Parse error" Just commits -> liftIO $ printCommits commits
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рд╡рд╛рдкрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╕реА рдмрд╛рдЗрдЯрд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╕рдлрд▓ рдерд╛, рддреЛ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдпреЛрдВ
рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд▓рд┐рдлреНрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЕрдВрдд
рд╕рдм рдХреБрдЫ, рд▓рд╛рд▓ рдХрд╛рд▓реАрди, рдзреВрдордзрд╛рдо рдФрд░ рд╢рд╛рдо рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддред рдПрдХ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг
рдпрд╣рд╛рдВ рд╕реНрдерд┐рдд
рд╣реИ ред рдХреЛрдб рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдЖрджрд░реНрд╢реЛрдВ рдХреА рд╡рд┐рдЬрдп рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреБрд░реБ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдмрд╛рдХреА рд╕рднреА рдиреЗ рдХреБрдЫ рд╕реАрдЦрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓рд┐рдпрд╛ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рджреБрдирд┐рдпрд╛ рдХреЗ рдХрд░реАрдм рд╣реЛ рдЧрдПред рдмрд▓ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддрд╛ рд╣реИ!